Package: php4-cgi
Version: 4.3.10-16

The FastCGI code in php4 does not handle SIGTERM
correctly. It should catch the signal and shut down
gracefully; instead it terminates immediately, even if
part-way through handling a request; in such a case, the
server will log ``Incomplete headers (0 bytes) received
from server...'' and the client will see a 500 HTTP error.
Since apache mod_fastcgi uses SIGTERM to (e.g.) shut down
excess dynamic FastCGI servers during the normal course of
operations, this is a problem in practice.

The problem is fixed by the patch below, against 4.3.10-16
(but should apply cleanly to later versions); I've put a
copy of this at
    
http://bitter.ukcod.org.uk/~chris/tmp/20060125/php-4.3.10-fastcgi-sigterm-fix.patch
in case it hasn't pasted cleanly (php uses tabs in source
code :-( ). Any chance this could make it into php4-cgi in
stable?

--- php4-4.3.10/sapi/cgi/cgi_main.c.orig        2004-07-14 23:38:18.000000000 
+0100
+++ php4-4.3.10/sapi/cgi/cgi_main.c     2006-01-25 19:38:24.000000000 +0000
@@ -948,6 +957,18 @@
 }
 #endif
 
+#if PHP_FASTCGI
+static sig_atomic_t fastcgi_finish;
+void fastcgi_child_terminate(int signal)
+{
+#ifdef DEBUG_FASTCGI
+       fprintf( stderr, "FastCGI termination signalled, pid %d\n", getpid() );
+#endif
+
+       fastcgi_finish = 1;
+}
+#endif
+
 /* {{{ main
  */
 int main(int argc, char *argv[])
@@ -1182,6 +1203,12 @@
                php_php_import_environment_variables = 
php_import_environment_variables;
                php_import_environment_variables = 
cgi_php_import_environment_variables;
 
+               /* Need to shut down cleanly on SIGTERM. */
+               act.sa_flags = 0;
+               act.sa_handler = fastcgi_child_terminate;
+               sigaction(SIGTERM, &act, NULL);
+               old_term = act;
+
                /* library is already initialized, now init our request */
                FCGX_Init();
                FCGX_InitRequest( &request, fcgi_fd, 0 );
@@ -1304,7 +1331,7 @@
 #endif
 
                while (!fastcgi
-                       || FCGX_Accept_r( &request ) >= 0) {
+                       || (!fastcgi_finish && FCGX_Accept_r( &request ) >= 0)) 
{
 #endif
 
 #if PHP_FASTCGI
@@ -1662,18 +1689,21 @@
                        if (!fastcgi) break;
                        /* only fastcgi will get here */
                        requests++;
-                       if(max_requests && (requests == max_requests)) {
-                               FCGX_Finish_r(&request);
-#ifndef PHP_WIN32
-                               if (bindpath) {
-                                       free(bindpath);
-                               }
-#endif
+                       if(max_requests && (requests == max_requests))
                                break;
-                       }
+
                        /* end of fastcgi loop */
                }
 #endif
+               if (fastcgi) {
+                       FCGX_Finish_r(&request);
+
+#ifndef PHP_WIN32
+                       if (bindpath) {
+                               free(bindpath);
+                       }
+#endif
+               }
 
                if (cgi_sapi_module.php_ini_path_override) {
                        free(cgi_sapi_module.php_ini_path_override);

-- 
``Dear Mr. Gadaffi,
  You must be very proud. It's not every day that a duck becomes president.''
  (from `I'm Sorry, I Haven't A Clue')


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to