lwp: Fix signal wait screwup for multiple different signals
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 27 Dec 2020 08:30:00 +0000 (09:30 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 17 Jan 2021 20:24:28 +0000 (21:24 +0100)
lwpSigWait() clears LwpSigCheck even when signals remain in
LwpSigCaught.  The next empth_wait_for_signal() will then wait until
another one gets caught.  Broken in commit fe2de3d74, v4.3.10.

Fix by clearing it only when LwpSigCaught is empty.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
src/lib/lwp/sig.c

index 04fb9f97741dba4d645c893673d3a8aa4e029afe..62d19728af5cbfadfdc7733c3a4bfd3d817e2e12 100644 (file)
@@ -91,9 +91,10 @@ static int
 lwpGetSig(sigset_t *set)
 {
     sigset_t save;
-    int i;
+    int i, j;
 
     sigprocmask(SIG_BLOCK, set, &save);
+
     for (i = NSIG - 1; i > 0; i--) {
        if (sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0) {
            lwpStatus(LwpCurrent, "Got awaited signal %d", i);
@@ -101,6 +102,14 @@ lwpGetSig(sigset_t *set)
            break;
        }
     }
+
+    for (j = i;
+        sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0;
+        j--)
+       ;
+    if (!j)
+       LwpSigCheck = 0;
+
     sigprocmask(SIG_SETMASK, &save, NULL);
     return i;
 }
@@ -119,7 +128,6 @@ lwpSigWait(sigset_t *set, int *sig)
     if (LwpSigWaiter)
        return EBUSY;
     for (;;) {
-       LwpSigCheck = 0;
        res = lwpGetSig(set);
        if (res > 0)
            break;