diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-11-05 10:09:08 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-11-05 10:09:08 +0100 |
commit | eeef72702692fca52610634da32b56241e8083f3 (patch) | |
tree | 35813fbb45213afbd3d1bd506cf2cbc6ff902d04 | |
parent | 57d93bebb2d940f4f2338a5e156f9ddcd7d1fbc7 (diff) | |
download | cygnal-eeef72702692fca52610634da32b56241e8083f3.tar.gz cygnal-eeef72702692fca52610634da32b56241e8083f3.tar.bz2 cygnal-eeef72702692fca52610634da32b56241e8083f3.zip |
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 <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/ChangeLog | 7 | ||||
-rw-r--r-- | 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 <corinna@vinschen.de> + + * 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 <corinna@vinschen.de> * 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 */ |