cvs: TSRM(PHP_5_3) / tsrm_win32.c
[email protected] ("Pierre-Alain Joye") Mon, 15 Jun 2009 15:01:01 -0000
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvspajoye1245078061@cvsserver> |
pajoye Mon Jun 15 15:01:01 2009 UTC
Modified files: (Branch: PHP_5_3)
/TSRM tsrm_win32.c
Log:
- #48535, file_exists returns false when impersonate is used
http://cvs.php.net/viewvc.cgi/TSRM/tsrm_win32.c?r1=1.27.2.1.2.7.2.9&r2=1.27.2.1.2.7.2.10&diff_format=u
Index: TSRM/tsrm_win32.c
diff -u TSRM/tsrm_win32.c:1.27.2.1.2.7.2.9 TSRM/tsrm_win32.c:1.27.2.1.2.7.2.10
--- TSRM/tsrm_win32.c:1.27.2.1.2.7.2.9 Tue Jun 9 09:25:18 2009
+++ TSRM/tsrm_win32.c Mon Jun 15 15:01:01 2009
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: tsrm_win32.c,v 1.27.2.1.2.7.2.9 2009/06/09 09:25:18 pajoye Exp $ */
+/* $Id: tsrm_win32.c,v 1.27.2.1.2.7.2.10 2009/06/15 15:01:01 pajoye Exp $ */
#include <stdio.h>
#include <fcntl.h>
@@ -41,12 +41,25 @@
static void tsrm_win32_ctor(tsrm_win32_globals *globals TSRMLS_DC)
{
+ HANDLE process_token = NULL;
+
globals->process = NULL;
globals->shm = NULL;
globals->process_size = 0;
globals->shm_size = 0;
globals->comspec = _strdup((GetVersion()<0x80000000)?"cmd.exe":"command.com");
globals->impersonation_token = NULL;
+
+ /* Access check requires impersonation token. Create a duplicate token. */
+ if(OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &process_token)) {
+ DuplicateToken(process_token, SecurityImpersonation, &globals->impersonation_token);
+ }
+
+ /* impersonation_token will be closed when the process dies */
+ if(process_token != NULL) {
+ CloseHandle(process_token);
+ process_token = NULL;
+ }
}
static void tsrm_win32_dtor(tsrm_win32_globals *globals TSRMLS_DC)
@@ -111,6 +124,10 @@
return errno;
}
+ if(TWG(impersonation_token) == NULL) {
+ goto Finished;
+ }
+
/* Do a full access check because access() will only check read-only attribute */
if(mode == 0 || mode > 6) {
desired_access = FILE_GENERIC_READ;
@@ -133,30 +150,11 @@
goto Finished;
}
- if(TWG(impersonation_token) == NULL) {
-
- if(!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &process_token)) {
- goto Finished;
- }
-
- /* Access check requires impersonation token. Create a duplicate token. */
- if(!DuplicateToken(process_token, SecurityImpersonation, &TWG(impersonation_token))) {
- goto Finished;
- }
- }
-
if(!AccessCheck((PSECURITY_DESCRIPTOR)psec_desc, TWG(impersonation_token), desired_access, &gen_map, &privilege_set, &priv_set_length, &granted_access, &fAccess)) {
goto Finished;
}
Finished:
-
- /* impersonation_token will be closed when the process dies */
- if(process_token != NULL) {
- CloseHandle(process_token);
- process_token = NULL;
- }
-
if(psec_desc != NULL) {
free(psec_desc);
psec_desc = NULL;