On Wed, 27 Nov 2024 17:37:55 +0100
Corinna Vinschen wrote:
> 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.fra...@t-online.de>
> > Reviewed-by:
> > Signed-off-by: Takashi Yano <takashi.y...@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...

Yeah, indeed. I have submitted v3 patch.

-- 
Takashi Yano <takashi.y...@nifty.ne.jp>

Reply via email to