The process that receives many SIGSTOP/SIGCONT signals sometimes hangs
on exit in sig_dispatch_pending(). This patch skips processing signals
in wait_sig() when exit_state > ES_EXIT_STARTING to avoid that situation.

Addresses: https://cygwin.com/pipermail/cygwin/2025-February/257473.html
Fixes: d243e51ef1d3 ("Cygwin: signal: Fix deadlock between main thread and sig 
thread")
Reported-by: Christian Franke <christian.fra...@t-online.de>
Reviewed-by:
Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp>
---
 winsup/cygwin/sigproc.cc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 8739f18f5..b519866d2 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -1374,7 +1374,11 @@ wait_sig (VOID *)
 
       sigq.retry = false;
       /* Don't process signals when we start exiting */
-      if (exit_state > ES_EXIT_STARTING && pack.si.si_signo > 0)
+      if (exit_state > ES_EXIT_STARTING
+         && (pack.si.si_signo > 0
+             || pack.si.si_signo == __SIGNOHOLD
+             || pack.si.si_signo == __SIGFLUSH
+             || pack.si.si_signo == __SIGFLUSHFAST))
        goto skip_process_signal;
 
       sigset_t dummy_mask;
-- 
2.45.1

Reply via email to