BUG/MINOR: external-checks: do not unblock undesired signals
The external checks code makes use of block_sigchld() and unblock_sigchld()
to ensure nobody modifies the signals list while they're being manipulated.
It happens that these functions clear the list of blocked signals, so they
can possibly have a side effect if other signals are blocked. For now no
other signal is blocked but it may very well change in the future so rather
correctly use SIG_BLOCK/SIG_UNBLOCK instead of touching unrelated signals.
This fix should be backported to 1.6 for correctness.
diff --git a/src/checks.c b/src/checks.c
index ee0295e..b925d05 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -1541,14 +1541,15 @@
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
- assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0);
+ assert(sigprocmask(SIG_BLOCK, &set, NULL) == 0);
}
void unblock_sigchld(void)
{
sigset_t set;
sigemptyset(&set);
- assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0);
+ sigaddset(&set, SIGCHLD);
+ assert(sigprocmask(SIG_UNBLOCK, &set, NULL) == 0);
}
/* Call with SIGCHLD blocked */