diff options
author | Anatol Belski <ab@php.net> | 2017-03-02 16:41:43 +0100 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2017-03-02 16:41:43 +0100 |
commit | 494fc16184ba2899f799d13c9fc4e06e272133a4 (patch) | |
tree | 7d6b3ec6bb240b8a85ecd30f144bafe0632c881e /Zend/zend_signal.c | |
parent | bf8c463f5bcb32b83cd6252d7f8cfb171523f353 (diff) | |
parent | c7b2c698d03466959874d933b1a44be125e25e4f (diff) | |
download | php-git-494fc16184ba2899f799d13c9fc4e06e272133a4.tar.gz |
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0:
do not try to handle signals, when globals are inconsistent
Diffstat (limited to 'Zend/zend_signal.c')
-rw-r--r-- | Zend/zend_signal.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 605187aed2..9a21831da2 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -86,12 +86,17 @@ void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context) { int errno_save = errno; zend_signal_queue_t *queue, *qtmp; + zend_bool is_handling_safe = 1; #ifdef ZTS ZEND_TSRMLS_CACHE_UPDATE(); + /* A signal could hit after TSRM shutdown, in this case globals are already freed. */ + if (NULL == TSRMG_BULK_STATIC(zend_signal_globals_id, zend_signal_globals_t *)) { + is_handling_safe = 0; + } #endif - if (EXPECTED(SIGG(active))) { + if (EXPECTED(is_handling_safe && SIGG(active))) { if (UNEXPECTED(SIGG(depth) == 0)) { /* try to handle signal */ if (UNEXPECTED(SIGG(blocked))) { SIGG(blocked) = 0; @@ -174,7 +179,14 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) int errno_save = errno; struct sigaction sa; sigset_t sigset; - zend_signal_entry_t p_sig = SIGG(handlers)[signo-1]; + zend_signal_entry_t p_sig; +#ifdef ZTS + if (NULL == TSRMG_BULK_STATIC(zend_signal_globals_id, zend_signal_globals_t *)) { + p_sig.flags = 0; + p_sig.handler = SIG_DFL; + } else +#endif + p_sig = SIGG(handlers)[signo-1]; if (p_sig.handler == SIG_DFL) { /* raise default handler */ if (sigaction(signo, NULL, &sa) == 0) { |