diff options
| -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) { |
