diff --git a/NEWS b/NEWS index 5f59d716a9a..0bf8ec8fc8c 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,10 @@ PHP NEWS . Fixed bug GH-8646 (Memory leak PHP FPM 8.1). (nielsdos) . Fixed bug GH-10801 (Named arguments in CTE functions cause a segfault). (nielsdos) + . Fixed bug GH-8789 (PHP 8.0.20 (ZTS) zend_signal_handler_defer crashes on + apache). (nielsdos) + . Fixed bug GH-10015 (zend_signal_handler_defer crashes on apache shutdown). + (nielsdos) - FPM: . Fixed bug GH-10611 (fpm_env_init_main leaks environ). (nielsdos) diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 3c090ccb8c5..3b9dd514bcc 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -85,8 +85,10 @@ void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context) zend_signal_queue_t *queue, *qtmp; #ifdef ZTS - /* A signal could hit after TSRM shutdown, in this case globals are already freed. */ - if (tsrm_is_shutdown()) { + /* A signal could hit after TSRM shutdown, in this case globals are already freed. + * Or it could be delivered to a thread that didn't execute PHP yet. + * In the latter case we act as if SIGG(active) is false. */ + if (tsrm_is_shutdown() || !tsrm_get_ls_cache()) { /* Forward to default handler handler */ zend_signal_handler(signo, siginfo, context); return; @@ -178,7 +180,7 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) sigset_t sigset; zend_signal_entry_t p_sig; #ifdef ZTS - if (tsrm_is_shutdown()) { + if (tsrm_is_shutdown() || !tsrm_get_ls_cache()) { p_sig.flags = 0; p_sig.handler = SIG_DFL; } else