diff options
author | Anatol Belski <ab@php.net> | 2017-03-02 16:39:32 +0100 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2017-03-02 16:40:38 +0100 |
commit | c7b2c698d03466959874d933b1a44be125e25e4f (patch) | |
tree | 1936e7538641db651c5bb3635db1ae065e14e8ff | |
parent | fab5ce347c57827b86c658afdb33825cf095cb5e (diff) | |
download | php-git-c7b2c698d03466959874d933b1a44be125e25e4f.tar.gz |
do not try to handle signals, when globals are inconsistent
-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 b4f57415d5..ba550a146a 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -74,12 +74,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; @@ -162,7 +167,14 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) int errno_save = errno; struct sigaction sa = {{0}}; 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) { |