From b0198cc4132381910cdeb9b5a867632b8b83262c 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. --- src/signal.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/signal.c b/src/signal.c index 20236fa54..288ef007d 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); }