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;