From bfb558dee35875037fdea18a6c7ae2c4a97bec13 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 27 Dec 2020 09:30:00 +0100 Subject: [PATCH] lwp: Fix signal wait screwup for multiple different signals 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 --- src/lib/lwp/sig.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/lib/lwp/sig.c b/src/lib/lwp/sig.c index 04fb9f977..62d19728a 100644 --- a/src/lib/lwp/sig.c +++ b/src/lib/lwp/sig.c @@ -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; -- 2.43.0