From eeef72702692fca52610634da32b56241e8083f3 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 5 Nov 2015 10:09:08 +0100 Subject: [PATCH] Fix iterating over pending signals if a signal doesn't have to be cleared * sigproc.cc (pending_signals::clear): Yet another fix to fix the fix. Actually iterate over the list of pending signals even if there's a signal which doesn't have to be cleared. Other than that, revert loop to it's former self as a while loop. Signed-off-by: Corinna Vinschen --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/sigproc.cc | 11 ++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index b848583e7..456bcd16c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2015-11-05 Corinna Vinschen + + * sigproc.cc (pending_signals::clear): Yet another fix to fix the fix. + Actually iterate over the list of pending signals even if there's a + signal which doesn't have to be cleared. Other than that, revert loop + to it's former self as a while loop. + 2015-11-04 Corinna Vinschen * globals.cc (ro_u_prlfs): Add trailing NUL. Explain why. diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 6a7708f0c..981004540 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -402,11 +402,16 @@ sig_clear (int sig) void pending_signals::clear (_cygtls *tls) { - sigpacket *q, *qnext; + sigpacket *q = &start, *qnext; - for (q = &start; (qnext = q->next); q->next = qnext->next) + while ((qnext = q->next)) if (qnext->sigtls == tls) - qnext->si.si_signo = 0; + { + qnext->si.si_signo = 0; + q->next = qnext->next; + } + else + q = qnext; } /* Clear pending signals of specific thread. Called from _cygtls::remove */