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

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

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/branches/PHP_5_3/TSRM/tsrm_win32.c

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

        if (!type) {
@@ -373,13 +375,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