Skip to content

Commit c7b2c69

Browse files
committed
do not try to handle signals, when globals are inconsistent
1 parent fab5ce3 commit c7b2c69

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

Zend/zend_signal.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,17 @@ void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context)
7474
{
7575
int errno_save = errno;
7676
zend_signal_queue_t *queue, *qtmp;
77+
zend_bool is_handling_safe = 1;
7778

7879
#ifdef ZTS
7980
ZEND_TSRMLS_CACHE_UPDATE();
81+
/* A signal could hit after TSRM shutdown, in this case globals are already freed. */
82+
if (NULL == TSRMG_BULK_STATIC(zend_signal_globals_id, zend_signal_globals_t *)) {
83+
is_handling_safe = 0;
84+
}
8085
#endif
8186

82-
if (EXPECTED(SIGG(active))) {
87+
if (EXPECTED(is_handling_safe && SIGG(active))) {
8388
if (UNEXPECTED(SIGG(depth) == 0)) { /* try to handle signal */
8489
if (UNEXPECTED(SIGG(blocked))) {
8590
SIGG(blocked) = 0;
@@ -162,7 +167,14 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context)
162167
int errno_save = errno;
163168
struct sigaction sa = {{0}};
164169
sigset_t sigset;
165-
zend_signal_entry_t p_sig = SIGG(handlers)[signo-1];
170+
zend_signal_entry_t p_sig;
171+
#ifdef ZTS
172+
if (NULL == TSRMG_BULK_STATIC(zend_signal_globals_id, zend_signal_globals_t *)) {
173+
p_sig.flags = 0;
174+
p_sig.handler = SIG_DFL;
175+
} else
176+
#endif
177+
p_sig = SIGG(handlers)[signo-1];
166178

167179
if (p_sig.handler == SIG_DFL) { /* raise default handler */
168180
if (sigaction(signo, NULL, &sa) == 0) {

0 commit comments

Comments
 (0)