From ebc92440594459457005e13c5356ff26e117d8aa Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 21 Jun 2016 17:29:46 +0200 Subject: [PATCH] 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. --- src/checks.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/checks.c b/src/checks.c index ee0295edf..b925d0561 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 */