]> granicus.if.org Git - php/commitdiff
Fix bug #73939 memory allocation in signal handler when HAVE_STRUCT_SIGINFO_T
authorJoe Watkins <krakjoe@php.net>
Mon, 16 Jan 2017 04:32:27 +0000 (04:32 +0000)
committerJoe Watkins <krakjoe@php.net>
Mon, 16 Jan 2017 04:32:27 +0000 (04:32 +0000)
ext/pcntl/pcntl.c
ext/pcntl/php_pcntl.h

index 07335192c6299c54332311de71fd5bfe84e6cfb2..a1ac06982d503b3bfe07a79548c9de07152ba625 100644 (file)
@@ -560,11 +560,6 @@ PHP_RSHUTDOWN_FUNCTION(pcntl)
        while (PCNTL_G(head)) {
                sig = PCNTL_G(head);
                PCNTL_G(head) = sig->next;
-#ifdef HAVE_STRUCT_SIGINFO_T
-               if (sig->siginfo) {
-                       zend_array_destroy(sig->siginfo);
-               }
-#endif
                efree(sig);
        }
        while (PCNTL_G(spares)) {
@@ -1379,11 +1374,7 @@ static void pcntl_signal_handler(int signo)
        psig->next = NULL;
 
 #ifdef HAVE_STRUCT_SIGINFO_T
-       zval user_siginfo;
-       array_init(&user_siginfo);
-       pcntl_siginfo_to_zval(signo, siginfo, &user_siginfo);
-       psig->siginfo = zend_array_dup(Z_ARRVAL(user_siginfo));
-       zval_ptr_dtor(&user_siginfo);
+       psig->siginfo = *siginfo;
 #endif
 
        /* the head check is important, as the tick handler cannot atomically clear both
@@ -1428,14 +1419,14 @@ void pcntl_signal_dispatch()
        PCNTL_G(head) = NULL; /* simple stores are atomic */
 
        /* Allocate */
-
        while (queue) {
                if ((handle = zend_hash_index_find(&PCNTL_G(php_signal_table), queue->signo)) != NULL) {
                        if (Z_TYPE_P(handle) != IS_LONG) {
                                ZVAL_NULL(&retval);
                                ZVAL_LONG(&params[0], queue->signo);
 #ifdef HAVE_STRUCT_SIGINFO_T
-                               ZVAL_ARR(&params[1], queue->siginfo);
+                               array_init(&params[1]);
+                               pcntl_siginfo_to_zval(queue->signo, &queue->siginfo, &params[1]);
 #else
                                ZVAL_NULL(&params[1]);
 #endif
index 865c496050d4d20f916f04aca8d8de52d6c25c36..1b13fb01c04a142dcdab70ecd28038094591ceb9 100644 (file)
@@ -77,7 +77,7 @@ struct php_pcntl_pending_signal {
        struct php_pcntl_pending_signal *next;
        zend_long signo;
 #ifdef HAVE_STRUCT_SIGINFO_T
-       zend_array *siginfo;
+       siginfo_t siginfo;
 #endif
 };