]> granicus.if.org Git - php/commitdiff
Fixed bug #78469
authorSergei Turchanov <turchanov@farpost.com>
Wed, 28 Aug 2019 03:05:14 +0000 (13:05 +1000)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 30 Aug 2019 14:06:50 +0000 (16:06 +0200)
fcgi_accept_request function is supposed to call a FastCGI implementation's
on_accept hook when entering an "accepting" stage (that is right before
calling "accept"). This hook implementation (fpm_request_accepting) updates
a worker state to an "accepting" state which is effectively an "Idle" state,
and updates counters on the scoreboard of the corresponding pool (idle++,
active--).

But this is not done when listening for client connections on a named pipe on
Windows platform. In that case a combination of
ConnectNamedPipe/WaitForSingleObject is used (to be able to catch in_shutdown
as far as I understand), but it is nonetheless functionally equivalent to
"accept" call. Also by not calling on_hook neither a worker's state is updated
to "accepting" state nor scoreboard counters are updated.

NEWS
main/fastcgi.c

diff --git a/NEWS b/NEWS
index 838f1d23e8dcf4cdc4af78f1a5b9891054aa766b..8ededb077d41bed3e62c6a17ad02f7b3bb8b9fff 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,10 @@ PHP                                                                        NEWS
   . Fixed bug #78412 (Generator incorrectly reports non-releasable $this as GC
     child). (Nikita)
 
+- FastCGI:
+  . Fixed bug #78469 (FastCGI on_accept hook is not called when using named
+    pipes on Windows). (Sergei Turchanov)
+
 - MySQLnd:
   . Fixed connect_attr issues and added the _server_host connection attribute.
     (Qianqian Bu)
index 318166187710812acd293426e4559893715b7210..4b3dd312ff79ddd31bb0248d3e33fe75396a0cc1 100644 (file)
@@ -1375,6 +1375,8 @@ int fcgi_accept_request(fcgi_request *req)
                                if (in_shutdown) {
                                        return -1;
                                }
+
+                               req->hook.on_accept();
 #ifdef _WIN32
                                if (!req->tcp) {
                                        pipe = (HANDLE)_get_osfhandle(req->listen_socket);
@@ -1405,8 +1407,6 @@ int fcgi_accept_request(fcgi_request *req)
                                        sa_t sa;
                                        socklen_t len = sizeof(sa);
 
-                                       req->hook.on_accept();
-
                                        FCGI_LOCK(req->listen_socket);
                                        req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
                                        FCGI_UNLOCK(req->listen_socket);