diff options
-rw-r--r-- | sigchainlib/sigchain.cc | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/sigchainlib/sigchain.cc b/sigchainlib/sigchain.cc index b4bd68b845..e61fcd880a 100644 --- a/sigchainlib/sigchain.cc +++ b/sigchainlib/sigchain.cc @@ -169,7 +169,8 @@ extern "C" int sigaction(int signal, const struct sigaction* new_action, struct // action but don't pass it on to the kernel. // Note that we check that the signal number is in range here. An out of range signal // number should behave exactly as the libc sigaction. - if (signal > 0 && signal < _NSIG && user_sigactions[signal].IsClaimed()) { + if (signal > 0 && signal < _NSIG && user_sigactions[signal].IsClaimed() && + (new_action == nullptr || new_action->sa_handler != SIG_DFL)) { struct sigaction saved_action = user_sigactions[signal].GetAction(); if (new_action != NULL) { user_sigactions[signal].SetAction(*new_action, false); @@ -210,7 +211,7 @@ extern "C" sighandler_t signal(int signal, sighandler_t handler) { // action but don't pass it on to the kernel. // Note that we check that the signal number is in range here. An out of range signal // number should behave exactly as the libc sigaction. - if (signal > 0 && signal < _NSIG && user_sigactions[signal].IsClaimed()) { + if (signal > 0 && signal < _NSIG && user_sigactions[signal].IsClaimed() && handler != SIG_DFL) { oldhandler = reinterpret_cast<sighandler_t>(user_sigactions[signal].GetAction().sa_handler); user_sigactions[signal].SetAction(sa, true); return oldhandler; |