Browse Source

Fixed bug #45423 (fastcgi parent process doesn't invoke php_module_shutdown before shutdown) (basant dot kukreja at sun dot com)

PHP-5.2.1RC1
Dmitry Stogov 18 years ago
parent
commit
51619fa391
  1. 2
      NEWS
  2. 43
      sapi/cgi/cgi_main.c
  3. 29
      sapi/cgi/fastcgi.c

2
NEWS

@ -13,6 +13,8 @@ PHP NEWS
accept lengths of 1024). (Felipe, andrew at lifescale dot com)
- Fixed bug #45449 (filesize() regression using ftp wrapper).
(crrodriguez at suse dot de)
- Fixed bug #45423 (fastcgi parent process doesn't invoke php_module_shutdown
before shutdown) (basant dot kukreja at sun dot com)
- Fixed bug #45352 (Segmentation fault because of tick function on second
request). (Dmitry)
- Fixed bug #45312 (Segmentation fault on second request for array functions).

43
sapi/cgi/cgi_main.c

@ -103,6 +103,12 @@ static int children = 0;
*/
static int parent = 1;
/* Did parent received exit signals SIG_TERM/SIG_INT/SIG_QUIT */
static int exit_signal = 0;
/* Is Parent waiting for children to exit */
static int parent_waiting = 0;
/**
* Process group
*/
@ -1135,7 +1141,7 @@ static void init_request_info(TSRMLS_D)
}
/* }}} */
#if PHP_FASTCGI
#if PHP_FASTCGI && !defined(PHP_WIN32)
/**
* Clean up child processes upon exit
*/
@ -1145,15 +1151,16 @@ void fastcgi_cleanup(int signal)
fprintf(stderr, "FastCGI shutdown, pid %d\n", getpid());
#endif
#ifndef PHP_WIN32
sigaction(SIGTERM, &old_term, 0);
/* Kill all the processes in our process group */
kill(-pgroup, SIGTERM);
#endif
/* We should exit at this point, but MacOSX doesn't seem to */
exit(0);
if (parent && parent_waiting) {
exit_signal = 1;
} else {
exit(0);
}
}
#endif
@ -1520,7 +1527,7 @@ consult the installation file that came with this distribution, or visit \n\
}
if (fcgi_in_shutdown()) {
exit(0);
goto parent_out;
}
while (parent) {
@ -1557,9 +1564,25 @@ 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
while (wait(&status) < 0) {
parent_waiting = 1;
while (1) {
if (wait(&status) >= 0) {
running--;
break;
} else if (exit_signal) {
break;
}
}
if (exit_signal) {
#if 0
while (running > 0) {
while (wait(&status) < 0) {
}
running--;
}
#endif
goto parent_out;
}
running--;
}
}
} else {
@ -2061,6 +2084,10 @@ out:
}
#endif
#ifndef PHP_WIN32
parent_out:
#endif
SG(server_context) = NULL;
php_module_shutdown(TSRMLS_C);
sapi_shutdown();

29
sapi/cgi/fastcgi.c

@ -170,6 +170,20 @@ static void fcgi_signal_handler(int signo)
}
}
static void fcgi_setup_signals(void)
{
struct sigaction new_sa, old_sa;
sigemptyset(&new_sa.sa_mask);
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);
}
}
#endif
int fcgi_in_shutdown(void)
@ -224,18 +238,7 @@ int fcgi_init(void)
is_initialized = 1;
errno = 0;
if (getpeername(0, (struct sockaddr *)&sa, &len) != 0 && errno == ENOTCONN) {
struct sigaction new_sa, old_sa;
sigemptyset(&new_sa.sa_mask);
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);
}
fcgi_setup_signals();
return is_fastcgi = 1;
} else {
return is_fastcgi = 0;
@ -501,6 +504,8 @@ int fcgi_listen(const char *path, int backlog)
if (tcp) {
listen_socket = _open_osfhandle((long)listen_socket, 0);
}
#else
fcgi_setup_signals();
#endif
return listen_socket;
}

Loading…
Cancel
Save