summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-12-05 08:55:15 +0000
committerDmitry Stogov <dmitry@php.net>2006-12-05 08:55:15 +0000
commit7389f59f4da24035e46d8a14ef0a55ab10596aee (patch)
tree31262b0b65f9bde37823b36aebc1931e7005d4e1
parent8f5786b6e838d3462f62149f9a7edeb49c775684 (diff)
downloadphp-git-7389f59f4da24035e46d8a14ef0a55ab10596aee.tar.gz
Fixed FastCGI impersonation for persistent connections on Windows
-rw-r--r--NEWS1
-rw-r--r--sapi/cgi/fastcgi.c26
2 files changed, 18 insertions, 9 deletions
diff --git a/NEWS b/NEWS
index 45728a0609..174efd4de4 100644
--- 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)
diff --git a/sapi/cgi/fastcgi.c b/sapi/cgi/fastcgi.c
index 1d0569f14a..381e1ddcec 100644
--- a/sapi/cgi/fastcgi.c
+++ b/sapi/cgi/fastcgi.c
@@ -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);