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

Reply via email to