[PATCH v2 3/7] Cygwin: signal: Cleanup signal queue after processing it

Corinna Vinschen corinna-cygwin@cygwin.com
Wed Nov 27 16:37:55 GMT 2024


Hi Takashi,

On Nov 26 17:55, Takashi Yano wrote:
> The queue is once cleaned up, however, sigpacket::process() may set
> si_signo in the queue to 0 by calling sig_clear(). This patch adds
> another loop for cleanup after calling sigpacket::process().
> 
> Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html
> Fixes: 9d2155089e87 ("(wait_sig): Define variable q to be the start of the signal queue.  Just iterate through sigq queue, deleting processed or zeroed signals")
> Reported-by: Christian Franke <Christian.Franke@t-online.de>
> Reviewed-by:
> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
> ---
>  winsup/cygwin/sigproc.cc | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
> index 8f46a80ab..b8d961a07 100644
> --- a/winsup/cygwin/sigproc.cc
> +++ b/winsup/cygwin/sigproc.cc
> @@ -1463,6 +1463,17 @@ wait_sig (VOID *)
>  		      qnext->si.si_signo = 0;
>  		    }
>  		}
> +	      /* Cleanup sigq chain. Remove entries having si_signo == 0.
> +		 There were once cleaned obeve, however sigpacket::process()
> +		 may set si_signo to 0 using sig_clear(). */
> +	      q = &sigq.start;
> +	      while ((qnext = q->next))
> +		{
> +		  if (qnext->si.si_signo)
> +		    q = qnext;
> +		  else
> +		    q->next = qnext->next;
> +		}

I'm not quite sure, but wouldn't it make more sense to change
sig_clear() so that it actually removes the entries from the queue
immediately?  Using Interlocked functions on the queue may even
avoid locking...


Thanks,
Corinna


More information about the Cygwin-patches mailing list