pajoye                                   Thu, 03 Sep 2009 19:16:17 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=288003

Log:
- #27051, improve fix on xp/2k3

Bug: http://bugs.php.net/27051 (Feedback) Impersonation with FastCGI does not 
EXEC process as impersonated user
      
Changed paths:
    U   php/php-src/trunk/TSRM/tsrm_win32.c

Modified: php/php-src/trunk/TSRM/tsrm_win32.c
===================================================================
--- php/php-src/trunk/TSRM/tsrm_win32.c 2009-09-03 19:11:30 UTC (rev 288002)
+++ php/php-src/trunk/TSRM/tsrm_win32.c 2009-09-03 19:16:17 UTC (rev 288003)
@@ -319,6 +319,8 @@
        char *ptype = (char *)type;
        HANDLE thread_token = NULL;
        HANDLE token_user = NULL;
+       BOOL asuser = FALSE;
+
        TSRMLS_FETCH();

        if (!type) {
@@ -374,13 +376,22 @@
        /* Get a token with the impersonated user. */
        if(OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, 
&thread_token)) {
                DuplicateTokenEx(thread_token, MAXIMUM_ALLOWED, &security, 
SecurityImpersonation, TokenPrimary, &token_user);
+       } else {
+               DWORD err = GetLastError();
+               if (err == ERROR_NO_TOKEN) {
+                       asuser = FALSE;
+               }
+
        }

        cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c 
")+2);
        sprintf(cmd, "%s /c \"%s\"", TWG(comspec), command);
-
-       res = CreateProcessAsUser(token_user, NULL, cmd, &security, &security, 
security.bInheritHandle, dwCreateFlags, env, cwd, &startup, &process);
-       CloseHandle(token_user);
+       if (asuser) {
+               res = CreateProcessAsUser(token_user, NULL, cmd, &security, 
&security, security.bInheritHandle, dwCreateFlags, env, cwd, &startup, 
&process);
+               CloseHandle(token_user);
+       } else {
+               res = CreateProcess(NULL, cmd, &security, &security, 
security.bInheritHandle, dwCreateFlags, env, cwd, &startup, &process);
+       }
        free(cmd);

        if (!res) {

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to