From: Willy Tarreau Date: Tue, 21 Jun 2016 15:29:46 +0000 (+0200) Subject: BUG/MINOR: external-checks: do not unblock undesired signals X-Git-Tag: v1.7-dev4~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebc92440594459457005e13c5356ff26e117d8aa;p=thirdparty%2Fhaproxy.git 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 ee0295edf3..b925d05613 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1541,14 +1541,15 @@ void block_sigchld(void) 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 */