diff options
Diffstat (limited to 'Zend/zend_signal.c')
-rw-r--r-- | Zend/zend_signal.c | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index b4f57415d5..1d8baaf0f5 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -48,7 +48,19 @@ #ifdef ZTS ZEND_API int zend_signal_globals_id; #else -zend_signal_globals_t zend_signal_globals; +ZEND_API zend_signal_globals_t zend_signal_globals; +#endif /* not ZTS */ + +#define SIGNAL_BEGIN_CRITICAL() \ + sigset_t oldmask; \ + zend_sigprocmask(SIG_BLOCK, &global_sigmask, &oldmask); +#define SIGNAL_END_CRITICAL() \ + zend_sigprocmask(SIG_SETMASK, &oldmask, NULL); + +#ifdef ZTS +# define zend_sigprocmask(signo, set, oldset) tsrm_sigmask((signo), (set), (oldset)) +#else +# define zend_sigprocmask(signo, set, oldset) sigprocmask((signo), (set), (oldset)) #endif static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context); @@ -160,7 +172,7 @@ ZEND_API void zend_signal_handler_unblock(void) static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) { int errno_save = errno; - struct sigaction sa = {{0}}; + struct sigaction sa; sigset_t sigset; zend_signal_entry_t p_sig = SIGG(handlers)[signo-1]; @@ -174,8 +186,16 @@ 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 */ + kill(getpid(), signo); + } +#else + kill(getpid(), signo); +#endif } } } else if (p_sig.handler != SIG_IGN) { /* ignore SIG_IGN */ @@ -197,7 +217,7 @@ static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context) * Register a signal handler that will be deferred in critical sections */ ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigaction *oldact) { - struct sigaction sa = {{0}}; + struct sigaction sa; sigset_t sigset; if (oldact != NULL) { @@ -213,6 +233,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; @@ -235,8 +256,9 @@ ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigac * Register a signal handler that will be deferred in critical sections */ ZEND_API int zend_signal(int signo, void (*handler)(int)) { - struct sigaction sa = {{0}}; + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); sa.sa_flags = 0; sa.sa_handler = handler; sa.sa_mask = global_sigmask; @@ -251,7 +273,7 @@ ZEND_API int zend_signal(int signo, void (*handler)(int)) */ static int zend_signal_register(int signo, void (*handler)(int, siginfo_t*, void*)) { - struct sigaction sa = {{0}}; + struct sigaction sa; if (sigaction(signo, NULL, &sa) == 0) { if ((sa.sa_flags & SA_SIGINFO) && sa.sa_sigaction == handler) { @@ -282,7 +304,7 @@ static int zend_signal_register(int signo, void (*handler)(int, siginfo_t*, void * Install our signal handlers, per request */ void zend_signal_activate(void) { - int x; + size_t x; memcpy(&SIGG(handlers), &global_orig_handlers, sizeof(global_orig_handlers)); @@ -300,8 +322,9 @@ void zend_signal_deactivate(void) { if (SIGG(check)) { - int x; - struct sigaction sa = {{0}}; + size_t x; + struct sigaction sa; + if (SIGG(depth) != 0) { zend_error(E_CORE_WARNING, "zend_signal: shutdown with non-zero blocking depth (%d)", SIGG(depth)); } @@ -338,10 +361,10 @@ static void zend_signal_globals_ctor(zend_signal_globals_t *zend_signal_globals) } /* }}} */ -void zend_signal_init() /* {{{ */ +void zend_signal_init(void) /* {{{ */ { int signo; - struct sigaction sa = {{0}}; + struct sigaction sa; /* Save previously registered signal handlers into orig_handlers */ memset(&global_orig_handlers, 0, sizeof(global_orig_handlers)); @@ -360,7 +383,7 @@ void zend_signal_init() /* {{{ */ /* {{{ zend_signal_startup * alloc zend signal globals */ -void zend_signal_startup() +void zend_signal_startup(void) { #ifdef ZTS |