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 */