From aa1142eded6e52740146fa6b41bbb60c8aeb571c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 3 Feb 2006 16:30:09 +0000 Subject: [PATCH] Fixed bug #36158 (SIGTERM is not handled correctly when running as a FastCGI server) --- NEWS | 2 ++ sapi/cgi/cgi_main.c | 6 ++++-- sapi/cgi/fastcgi.c | 10 ++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 148c94a7f1..709fc50549 100644 --- a/NEWS +++ b/NEWS @@ -33,6 +33,8 @@ PHP NEWS - Fixed bug #36185 (str_rot13() crash on non-string parameter). (Pierre) - Fixed bug #36176 (PDO_PGSQL - PDO::exec() does not return number of rows affected by the operation). (Ilia) +- Fixed bug #36158 (SIGTERM is not handled correctly when running as a FastCGI + server). (Dmitry) - Fixed bug #36152 (problems with curl+ssl and pgsql+ssl in same PHP). (Mike) - Fixed bug #36148 (unpack("H*hex", $data) is adding an extra character to the end of the string). (Ilia) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index ac60c08d46..3d33dff573 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -274,7 +274,7 @@ static void sapi_cgibin_flush(void *server_context) #ifndef PHP_WIN32 !parent && #endif - (!request || FCGX_FFlush(request->out) == -1)) { + request && FCGX_FFlush(request->out) == -1) { php_handle_aborted_connection(); } return; @@ -1242,7 +1242,8 @@ consult the installation file that came with this distribution, or visit \n\ #ifdef DEBUG_FASTCGI fprintf(stderr, "Wait for kids, pid %d\n", getpid()); #endif - wait(&status); + while (wait(&status) < 0) { + } running--; } } @@ -1656,6 +1657,7 @@ fastcgi_request_done: exit_status = 255; } zend_end_try(); + SG(server_context) = NULL; php_module_shutdown(TSRMLS_C); sapi_shutdown(); diff --git a/sapi/cgi/fastcgi.c b/sapi/cgi/fastcgi.c index f2ba15982e..d616592391 100644 --- a/sapi/cgi/fastcgi.c +++ b/sapi/cgi/fastcgi.c @@ -157,7 +157,7 @@ static DWORD WINAPI fcgi_shutdown_thread(LPVOID arg) static void fcgi_signal_handler(int signo) { - if (signo == SIGUSR1) { + if (signo == SIGUSR1 || signo == SIGTERM) { in_shutdown = 1; } } @@ -217,6 +217,7 @@ int fcgi_init(void) new_sa.sa_flags = 0; new_sa.sa_handler = fcgi_signal_handler; sigaction(SIGUSR1, &new_sa, NULL); + sigaction(SIGTERM, &new_sa, NULL); sigaction(SIGPIPE, NULL, &old_sa); if (old_sa.sa_handler == SIG_DFL) { sigaction(SIGPIPE, &new_sa, NULL); @@ -627,6 +628,9 @@ int fcgi_accept_request(fcgi_request *req) while (1) { if (req->fd < 0) { while (1) { + if (in_shutdown) { + return -1; + } #ifdef _WIN32 HANDLE pipe = (HANDLE)_get_osfhandle(req->listen_socket); OVERLAPPED ov; @@ -663,7 +667,7 @@ int fcgi_accept_request(fcgi_request *req) FCGI_UNLOCK(req->listen_socket); #endif - if (in_shutdown || (req->fd < 0 && errno != EINTR)) { + if (req->fd < 0 && (in_shutdown || errno != EINTR)) { return -1; } @@ -686,6 +690,8 @@ try_again: } #endif } + } else if (in_shutdown) { + return -1; } if (fcgi_read_request(req)) { return req->fd; -- 2.50.1