summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Turchanov <turchanov@farpost.com>2019-08-28 13:05:14 +1000
committerNikita Popov <nikita.ppv@gmail.com>2019-08-30 16:06:50 +0200
commit8f564e5308970e3c1b96fd17e493c5c3a952954b (patch)
treeb6b08a309a6b2b4fa298d037be2cd3c8ffcb83b4
parented749edd477bfcc3923c086a6443aaa91192e5b7 (diff)
downloadphp-git-8f564e5308970e3c1b96fd17e493c5c3a952954b.tar.gz
Fixed bug #78469
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.
-rw-r--r--NEWS4
-rw-r--r--main/fastcgi.c4
2 files changed, 6 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 838f1d23e8..8ededb077d 100644
--- 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)
diff --git a/main/fastcgi.c b/main/fastcgi.c
index 3181661877..4b3dd312ff 100644
--- a/main/fastcgi.c
+++ b/main/fastcgi.c
@@ -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);