]> granicus.if.org Git - php/commitdiff
Fixed FastCGI impersonation for persistent connections on Windows
authorDmitry Stogov <dmitry@php.net>
Tue, 5 Dec 2006 08:55:34 +0000 (08:55 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 5 Dec 2006 08:55:34 +0000 (08:55 +0000)
sapi/cgi/fastcgi.c

index 1d0569f14a8f459b84691f96bf65bc6e7ad175d7..381e1ddcecb9c001e995250d110e7b483c620169 100644 (file)
@@ -616,6 +616,13 @@ static inline void fcgi_close(fcgi_request *req, int force, int destroy)
        if (destroy) {
                zend_hash_destroy(&req->env);
        }
+
+#ifdef _WIN32
+       if (is_impersonate) {
+               RevertToSelf();
+       }
+#endif
+
        if ((force || !req->keep) && req->fd >= 0) {
 #ifdef _WIN32
                HANDLE pipe = (HANDLE)_get_osfhandle(req->fd);
@@ -624,9 +631,6 @@ static inline void fcgi_close(fcgi_request *req, int force, int destroy)
                        FlushFileBuffers(pipe);
                }
                DisconnectNamedPipe(pipe);
-               if (is_impersonate) {
-                       RevertToSelf();
-               }
 #else
                if (!force) {
                        char buf[8];
@@ -673,12 +677,7 @@ int fcgi_accept_request(fcgi_request *req)
                                        }
                                }
                                CloseHandle(ov.hEvent);
-                               if (is_impersonate && !ImpersonateNamedPipeClient(pipe)) {
-                                       DisconnectNamedPipe(pipe);
-                                       req->fd = -1;
-                               } else {
-                                       req->fd = req->listen_socket;
-                               }
+                               req->fd = req->listen_socket;
                                FCGI_UNLOCK(req->listen_socket);
 #else
                                {
@@ -718,6 +717,15 @@ try_again:
                        return -1;
                }
                if (fcgi_read_request(req)) {
+#ifdef _WIN32
+                       if (is_impersonate) {
+                               pipe = (HANDLE)_get_osfhandle(req->fd);
+                               if (!ImpersonateNamedPipeClient(pipe)) {
+                                       fcgi_close(req, 1, 1);
+                                       continue;
+                               }
+                       }
+#endif
                        return req->fd;
                } else {
                        fcgi_close(req, 1, 1);