Delegate SIG_DFL on sigaction to libc.
In the case when user registers SIG_DFL hanlder
sigchainlib's handler tends to go into infinite loop
because the function handling signals resets signal
using by calling to signchain's own implementation.
This cl fixes the problem by passing sigcations with
SIG_DFL to the next sigaction (usually libc's).
Bug: 19594886
Change-Id: I9eecf9afd1c7e6d1fe3cd1d4fc506383ecbebe04
diff --git a/sigchainlib/sigchain.cc b/sigchainlib/sigchain.cc
index b4bd68b..e61fcd8 100644
--- a/sigchainlib/sigchain.cc
+++ b/sigchainlib/sigchain.cc
@@ -169,7 +169,8 @@
// 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 @@
// 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;