diff options
| author | Nikita Popov <nikic@php.net> | 2016-12-29 21:18:58 +0100 |
|---|---|---|
| committer | Nikita Popov <nikic@php.net> | 2016-12-29 21:18:58 +0100 |
| commit | 270f1ffd19bccf799ece32ce136842edd69a333a (patch) | |
| tree | 991f074f05b39bf1b31fd6eeaa503946d3dc3203 | |
| parent | 30029d137f17573c530fbd56f93e0a268eb177b1 (diff) | |
| parent | b09c2f899ebc14029d0936d770cced10b607f84b (diff) | |
| download | php-git-270f1ffd19bccf799ece32ce136842edd69a333a.tar.gz | |
Merge branch 'PHP-7.1'
| -rw-r--r-- | Zend/zend_signal.c | 12 | ||||
| -rw-r--r-- | ext/pcntl/tests/bug73783.phpt | 28 |
2 files changed, 36 insertions, 4 deletions
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 1d8baaf0f5..605187aed2 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -198,7 +198,7 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) #endif } } - } else if (p_sig.handler != SIG_IGN) { /* ignore SIG_IGN */ + } else { if (p_sig.flags & SA_SIGINFO) { if (p_sig.flags & SA_RESETHAND) { SIGG(handlers)[signo-1].flags = 0; @@ -234,9 +234,13 @@ ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigac } memset(&sa, 0, sizeof(sa)); - sa.sa_flags = SA_SIGINFO | (act->sa_flags & SA_FLAGS_MASK); - sa.sa_sigaction = zend_signal_handler_defer; - sa.sa_mask = global_sigmask; + if (SIGG(handlers)[signo-1].handler == (void *) SIG_IGN) { + sa.sa_sigaction = (void *) SIG_IGN; + } else { + sa.sa_flags = SA_SIGINFO | (act->sa_flags & SA_FLAGS_MASK); + sa.sa_sigaction = zend_signal_handler_defer; + sa.sa_mask = global_sigmask; + } if (sigaction(signo, &sa, NULL) < 0) { zend_error_noreturn(E_ERROR, "Error installing signal handler for %d", signo); diff --git a/ext/pcntl/tests/bug73783.phpt b/ext/pcntl/tests/bug73783.phpt new file mode 100644 index 0000000000..beacdf6b8d --- /dev/null +++ b/ext/pcntl/tests/bug73783.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #73783: (SIG_IGN needs to be set to prevent syscals from returning early) +--SKIPIF-- +<?php + if (!extension_loaded('pcntl')) die('skip pcntl extension not available'); + elseif (!extension_loaded('posix')) die('skip posix extension not available'); +?> +--FILE-- +<?php +pcntl_signal(SIGCHLD, SIG_IGN); + +switch(pcntl_fork()) { + case 0: + exit; + break; +} + +$before = microtime(true); +sleep(1); + +if (microtime(true) - $before >= 0.8) { + echo "working\n"; +} else { + echo "failed\n"; +} +?> +--EXPECTF-- +working |
