]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: wdt: Don't ignore WDTSIG and DEBUGSIG in __signal_process_queue().
authorOlivier Houchard <cognet@ci0.org>
Wed, 18 Mar 2020 12:10:05 +0000 (13:10 +0100)
committerOlivier Houchard <cognet@ci0.org>
Wed, 18 Mar 2020 12:10:05 +0000 (13:10 +0100)
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

index 20236fa543f1b53046569167cc6b791e360dea28..288ef007db534b2fd5541178d71530d805ace0af 100644 (file)
@@ -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);
 }