https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=c0d7a921bb806ab92f8f05baeaf0e489ee51d3ce

commit c0d7a921bb806ab92f8f05baeaf0e489ee51d3ce
Author: Takashi Yano <[email protected]>
Date:   Wed Mar 12 08:41:18 2025 +0900

    Cygwin: signal: Do not clear signals in the queue
    
    Currently, sigpacket::process() clears some signals from the queue.
    For instance, SIGSTOP clears SIGCONT and SIGCONT clears SIGSTOP, etc.
    These might be needed by previous queue design, however, new queue
    design does not require that. On the contrary, that causes signal
    lost. With this patch, these sig_clear() calls are removed.
    
    Addresses: https://cygwin.com/pipermail/cygwin/2025-March/257582.html
    Fixes: 1fd5e000ace5 ("import winsup-2000-02-17 snapshot")
    Reported-by: Christian Franke <[email protected]>
    Reviewed-by: Corinna Vinschen <[email protected]>
    Signed-off-by: Takashi Yano <[email protected]>

Diff:
---
 winsup/cygwin/exceptions.cc | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index d71345eb3..e2a2054cd 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -1436,12 +1436,6 @@ _cygtls::handle_SIGCONT ()
 
   myself->stopsig = 0;
   InterlockedAnd ((LONG *) &myself->process_state, ~PID_STOPPED);
-
-  /* Clear pending stop signals */
-  sig_clear (SIGSTOP, false);
-  sig_clear (SIGTSTP, false);
-  sig_clear (SIGTTIN, false);
-  sig_clear (SIGTTOU, false);
 }
 
 int
@@ -1547,15 +1541,7 @@ sigpacket::process ()
   if (si.si_signo == SIGKILL)
     goto exit_sig;
   if (si.si_signo == SIGSTOP)
-    {
-      sig_clear (SIGCONT, false);
-      goto stop;
-    }
-
-  /* Clear pending SIGCONT on stop signals */
-  if (si.si_signo == SIGTSTP || si.si_signo == SIGTTIN
-      || si.si_signo == SIGTTOU)
-    sig_clear (SIGCONT, false);
+    goto stop;
 
   if (handler == (void *) SIG_DFL)
     {

Reply via email to