From 565ed0dc0465ad67891b4789f563db96c3143365 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Wed, 18 Mar 2020 13:10:05 +0100 Subject: [PATCH] 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. (cherry picked from commit b0198cc4132381910cdeb9b5a867632b8b83262c) Signed-off-by: Willy Tarreau --- src/signal.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/signal.c b/src/signal.c index 20236fa..288ef00 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); } -- 1.7.10.4