summaryrefslogtreecommitdiff
path: root/Zend/zend_signal.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2017-03-02 16:41:43 +0100
committerAnatol Belski <ab@php.net>2017-03-02 16:41:43 +0100
commit494fc16184ba2899f799d13c9fc4e06e272133a4 (patch)
tree7d6b3ec6bb240b8a85ecd30f144bafe0632c881e /Zend/zend_signal.c
parentbf8c463f5bcb32b83cd6252d7f8cfb171523f353 (diff)
parentc7b2c698d03466959874d933b1a44be125e25e4f (diff)
downloadphp-git-494fc16184ba2899f799d13c9fc4e06e272133a4.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: do not try to handle signals, when globals are inconsistent
Diffstat (limited to 'Zend/zend_signal.c')
-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) {