summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_signal.c16
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) {