]> granicus.if.org Git - php/commitdiff
Fixed bug #36158 (SIGTERM is not handled correctly when running as a FastCGI server)
authorDmitry Stogov <dmitry@php.net>
Fri, 3 Feb 2006 16:30:09 +0000 (16:30 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 3 Feb 2006 16:30:09 +0000 (16:30 +0000)
NEWS
sapi/cgi/cgi_main.c
sapi/cgi/fastcgi.c

diff --git a/NEWS b/NEWS
index 148c94a7f1c6fd5b50c317332982071c27ef42f1..709fc5054936f2f615502580728273eb4f7f538b 100644 (file)
--- 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)
index ac60c08d4690cdb26b5022533b4db5481c1a40a8..3d33dff573f42111b7124263a5ca0c2a5f4a438c 100644 (file)
@@ -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();
 
index f2ba15982e7e67ef2a8db14b3e1b40529e505d9a..d6165923914d0e0f476d426b6f0779655647cb54 100644 (file)
@@ -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;