lbarnaud Mon, 01 Nov 2010 22:43:59 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=305020
Log: MFH fixed bug #52784 (Race condition when handling many concurrent signals) Bug: http://bugs.php.net/52784 (Assigned) Race condition when handling many concurrent signals Changed paths: _U php/php-src/branches/PHP_5_3/ U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/ext/pcntl/pcntl.c U php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.c U php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.h _U php/php-src/branches/PHP_5_3/ext/spl/tests/ _U php/php-src/branches/PHP_5_3/ext/tidy/tests/ _U php/php-src/branches/PHP_5_3/sapi/fpm/php-fpm.8.in _U php/php-src/branches/PHP_5_3/tests/security/open_basedir_parse_ini_file.phpt Property changes on: php/php-src/branches/PHP_5_3 ___________________________________________________________________ Modified: svn:mergeinfo - /php/php-src/trunk:284726,305015 + /php/php-src/trunk:284726,305015,305018-305019 Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2010-11-01 22:40:29 UTC (rev 305019) +++ php/php-src/branches/PHP_5_3/NEWS 2010-11-01 22:43:59 UTC (rev 305020) @@ -88,6 +88,8 @@ (CURLOPT_STDERR)). (Gustavo) - Fixed bug #52786 (PHP should reset section to [PHP] after ini sections). (Fedora at famillecollet dot com) +- Fixed bug #52784 (Race condition when handling many concurrent signals). + (nick dot telford at gmail dot com, Arnaud) - Fixed bug #52772 (var_dump() doesn't check for the existence of get_class_name before calling it). (Kalle, Gustavo) - Fixed bug #52744 (cal_days_in_month incorrect for December 1 BCE). Modified: php/php-src/branches/PHP_5_3/ext/pcntl/pcntl.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/pcntl/pcntl.c 2010-11-01 22:40:29 UTC (rev 305019) +++ php/php-src/branches/PHP_5_3/ext/pcntl/pcntl.c 2010-11-01 22:43:59 UTC (rev 305020) @@ -887,7 +887,7 @@ zend_hash_index_update(&PCNTL_G(php_signal_table), signo, (void **) &handle, sizeof(zval *), (void **) &dest_handle); if (dest_handle) zval_add_ref(dest_handle); - if (php_signal(signo, pcntl_signal_handler, (int) restart_syscalls) == SIG_ERR) { + if (php_signal4(signo, pcntl_signal_handler, (int) restart_syscalls, 1) == SIG_ERR) { PCNTL_G(last_error) = errno; php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error assigning signal"); RETURN_FALSE; @@ -1224,11 +1224,19 @@ { zval *param, **handle, *retval; struct php_pcntl_pending_signal *queue, *next; + sigset_t mask; + sigset_t old_mask; TSRMLS_FETCH(); + + /* Mask all signals */ + sigfillset(&mask); + sigprocmask(SIG_BLOCK, &mask, &old_mask); /* Bail if the queue is empty or if we are already playing the queue*/ - if (! PCNTL_G(head) || PCNTL_G(processing_signal_queue)) + if (! PCNTL_G(head) || PCNTL_G(processing_signal_queue)) { + sigprocmask(SIG_SETMASK, &old_mask, NULL); return; + } /* Prevent reentrant handler calls */ PCNTL_G(processing_signal_queue) = 1; @@ -1260,6 +1268,9 @@ /* Re-enable queue */ PCNTL_G(processing_signal_queue) = 0; + + /* return signal mask to previous state */ + sigprocmask(SIG_SETMASK, &old_mask, NULL); } Modified: php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.c 2010-11-01 22:40:29 UTC (rev 305019) +++ php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.c 2010-11-01 22:43:59 UTC (rev 305020) @@ -22,11 +22,15 @@ /* php_signal using sigaction is derrived from Advanced Programing * in the Unix Environment by W. Richard Stevens p 298. */ -Sigfunc *php_signal(int signo, Sigfunc *func, int restart) +Sigfunc *php_signal4(int signo, Sigfunc *func, int restart, int mask_all) { struct sigaction act,oact; act.sa_handler = func; - sigemptyset(&act.sa_mask); + if (mask_all) { + sigfillset(&act.sa_mask); + } else { + sigemptyset(&act.sa_mask); + } act.sa_flags = 0; if (signo == SIGALRM || (! restart)) { #ifdef SA_INTERRUPT @@ -43,6 +47,11 @@ return oact.sa_handler; } +Sigfunc *php_signal(int signo, Sigfunc *func, int restart) +{ + return php_signal4(signo, func, restart, 0); +} + /* * Local variables: * tab-width: 4 Modified: php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.h =================================================================== --- php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.h 2010-11-01 22:40:29 UTC (rev 305019) +++ php/php-src/branches/PHP_5_3/ext/pcntl/php_signal.h 2010-11-01 22:43:59 UTC (rev 305020) @@ -31,5 +31,6 @@ typedef void Sigfunc(int); Sigfunc *php_signal(int signo, Sigfunc *func, int restart); +Sigfunc *php_signal4(int signo, Sigfunc *func, int restart, int mask_all); #endif Property changes on: php/php-src/branches/PHP_5_3/ext/spl/tests ___________________________________________________________________ Modified: svn:mergeinfo - /php/php-src/trunk:300463 /php/php-src/trunk/ext/spl/tests:284726,300463,300481,305015 + /php/php-src/trunk:300463 /php/php-src/trunk/ext/spl/tests:284726,300463,300481,305015,305018-305019 Property changes on: php/php-src/branches/PHP_5_3/ext/tidy/tests ___________________________________________________________________ Modified: svn:mergeinfo - /php/php-src/trunk/ext/tidy/tests:284726,287798-287941,305015 + /php/php-src/trunk/ext/tidy/tests:284726,287798-287941,305015,305018-305019 Property changes on: php/php-src/branches/PHP_5_3/sapi/fpm/php-fpm.8.in ___________________________________________________________________ Modified: svn:mergeinfo - /php/php-src/trunk/sapi/fpm/php-fpm.1.in:284726 /php/php-src/trunk/sapi/fpm/php-fpm.8.in:305015 + /php/php-src/trunk/sapi/fpm/php-fpm.1.in:284726 /php/php-src/trunk/sapi/fpm/php-fpm.8.in:305015,305018-305019 Property changes on: php/php-src/branches/PHP_5_3/tests/security/open_basedir_parse_ini_file.phpt ___________________________________________________________________ Modified: svn:mergeinfo - /php/php-src/trunk/tests/security/open_basedir_parse_ini_file.phpt:265951,305015 + /php/php-src/trunk/tests/security/open_basedir_parse_ini_file.phpt:265951,305015,305018-305019
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
