lwp: Fix handling of sigismember() failure
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 27 Dec 2020 07:18:27 +0000 (08:18 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sat, 23 Jan 2021 06:08:03 +0000 (07:08 +0100)
sigismember() fails when passed an invalid or unsupported signal
number.  lwpInitSigWait() and lwpGetSig() treat sigismember() failure
like "is a member".  lwpInitSigWait() will then sigaction()
unsuccessfully.  Harmless.  lwpGetSig() returns the bad signal number
when it's greater than any caught signal's number.  The bad signal
number then gets returned to main(), which shuts down the server.

Fix by treating failure like "is not a member".

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

index cdf29709b044a55ecd3f7dc633d32d7ba08231d0..04fb9f97741dba4d645c893673d3a8aa4e029afe 100644 (file)
@@ -69,7 +69,7 @@ lwpInitSigWait(sigset_t *set)
     act.sa_mask = *set;
     act.sa_handler = lwpCatchAwaitedSig;
     for (i = 0; i < NSIG; i++) {
-       if (sigismember(set, i))
+       if (sigismember(set, i) > 0)
            sigaction(i, &act, NULL);
     }
 }
@@ -95,7 +95,7 @@ lwpGetSig(sigset_t *set)
 
     sigprocmask(SIG_BLOCK, set, &save);
     for (i = NSIG - 1; i > 0; i--) {
-       if (sigismember(set, i) && sigismember(&LwpSigCaught, i)) {
+       if (sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0) {
            lwpStatus(LwpCurrent, "Got awaited signal %d", i);
            sigdelset(&LwpSigCaught, i);
            break;