summaryrefslogtreecommitdiff
path: root/Zend/zend_signal.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-06-24 18:00:47 +0300
committerDmitry Stogov <dmitry@zend.com>2016-06-24 18:00:47 +0300
commite5a8dd8ca910ebf3a62bb2a414bc68813c831e9e (patch)
treeca4b6154201e4099d9d6a87f6771193e95004d73 /Zend/zend_signal.c
parent03ebdb4616c91e5b83d8ee1d893dd77be7de2137 (diff)
downloadphp-git-e5a8dd8ca910ebf3a62bb2a414bc68813c831e9e.tar.gz
Add temporary workaround for raise() failure
Diffstat (limited to 'Zend/zend_signal.c')
-rw-r--r--Zend/zend_signal.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c
index 1bbf49619a..95c4658477 100644
--- a/Zend/zend_signal.c
+++ b/Zend/zend_signal.c
@@ -176,7 +176,6 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context)
sigset_t sigset;
zend_signal_entry_t p_sig = SIGG(handlers)[signo-1];
- memset(&sa, 0, sizeof(sa));
if (p_sig.handler == SIG_DFL) { /* raise default handler */
if (sigaction(signo, NULL, &sa) == 0) {
sa.sa_handler = SIG_DFL;
@@ -187,8 +186,17 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context)
if (sigaction(signo, &sa, NULL) == 0) {
/* throw away any blocked signals */
- sigprocmask(SIG_UNBLOCK, &sigset, NULL);
- raise(signo);
+ zend_sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+#ifdef ZTS
+# define RAISE_ERROR "raise() failed\n"
+ if (raise(signo) != 0) {
+ /* On some systems raise() fails with errno 3: No such process */
+ write(2, RAISE_ERROR, sizeof(RAISE_ERROR)-1);
+ _exit(1);
+ }
+#else
+ kill(getpid(), signo);
+#endif
}
}
} else if (p_sig.handler != SIG_IGN) { /* ignore SIG_IGN */
@@ -213,7 +221,6 @@ ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigac
struct sigaction sa;
sigset_t sigset;
- memset(&sa, 0, sizeof(sa));
if (oldact != NULL) {
oldact->sa_flags = SIGG(handlers)[signo-1].flags;
oldact->sa_handler = (void *) SIGG(handlers)[signo-1].handler;
@@ -227,6 +234,7 @@ ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigac
SIGG(handlers)[signo-1].handler = (void *) act->sa_handler;
}
+ 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;
@@ -268,7 +276,6 @@ static int zend_signal_register(int signo, void (*handler)(int, siginfo_t*, void
{
struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
if (sigaction(signo, NULL, &sa) == 0) {
if ((sa.sa_flags & SA_SIGINFO) && sa.sa_sigaction == handler) {
return FAILURE;
@@ -319,7 +326,6 @@ void zend_signal_deactivate(void)
size_t x;
struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
if (SIGG(depth) != 0) {
zend_error(E_CORE_WARNING, "zend_signal: shutdown with non-zero blocking depth (%d)", SIGG(depth));
}
@@ -361,7 +367,6 @@ void zend_signal_init(void) /* {{{ */
int signo;
struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
/* Save previously registered signal handlers into orig_handlers */
memset(&global_orig_handlers, 0, sizeof(global_orig_handlers));
for (signo = 1; signo < NSIG; ++signo) {