]> 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:15 +0000 (08:55 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 5 Dec 2006 08:55:15 +0000 (08:55 +0000)
NEWS
sapi/cgi/fastcgi.c

diff --git a/NEWS b/NEWS
index 45728a060928780029632987b66e1710b90ae7b4..174efd4de428b8d103d7eb4a889ab2f99abade34 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2007, PHP 5.2.1
+- Fixed FastCGI impersonation for persistent connections on Windows. (Dmitry)
 - Added a meta tag to phpinfo() output to prevent search engines from indexing 
   the page. (Ilia)
 - Added missing object support to file_put_contents(). (Ilia)
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);