lwp: Fix handling of sigismember() failure

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>
This commit is contained in:
Markus Armbruster 2020-12-27 08:18:27 +01:00
parent f15bb68b63
commit aae823507c

View file

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