From: Olivier Houchard Date: Wed, 18 Mar 2020 12:10:05 +0000 (+0100) Subject: BUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue(). X-Git-Tag: v2.2-dev5~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0198cc4132381910cdeb9b5a867632b8b83262c;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue(). When running __signal_process_queue(), we ignore most signals. We can't, however, ignore WDTSIG and DEBUGSIG, otherwise that thread may end up waiting for another one that could hold a glibc lock, while the other thread wait for this one to enter debug_handler(). So make sure WDTSIG and DEBUGSIG aren't ignored, if they are defined. This probably explains the watchdog deadlock described in github issue This should be backported to 2.1, 2.0 and 1.9. --- diff --git a/src/signal.c b/src/signal.c index 20236fa543..288ef007db 100644 --- a/src/signal.c +++ b/src/signal.c @@ -114,11 +114,19 @@ static void signal_init() /* man sigprocmask: If SIGBUS, SIGFPE, SIGILL, or SIGSEGV are generated while they are blocked, the result is undefined, unless the signal was generated by kill(2), - sigqueue(3), or raise(3) */ + sigqueue(3), or raise(3). + Do not ignore WDTSIG or DEBUGSIG either, or it may deadlock the + watchdog */ sigdelset(&blocked_sig, SIGBUS); sigdelset(&blocked_sig, SIGFPE); sigdelset(&blocked_sig, SIGILL); sigdelset(&blocked_sig, SIGSEGV); +#ifdef DEBUGSIG + sigdelset(&blocked_sig, DEBUGSIG); +#endif +#ifdef WDTSIG + sigdelset(&blocked_sig, WDTSIG); +#endif for (sig = 0; sig < MAX_SIGNAL; sig++) LIST_INIT(&signal_state[sig].handlers); }