Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-11-05 12:09:08 +0300
committerCorinna Vinschen <corinna@vinschen.de>2015-11-05 12:10:16 +0300
commitd735b30eefe2d35d0d2a2d66ac12004662fc1525 (patch)
tree4c53ee164ece891d0430dfbff4a61d578b9b5189
parent8474c4535bd2e2064b3d5738559be4248b7900af (diff)
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/ChangeLog7
-rw-r--r--winsup/cygwin/sigproc.cc11
2 files changed, 15 insertions, 3 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 294638785..a3f7cac30 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 */