diff --git a/libc/calls/sig.c b/libc/calls/sig.c index 86af41b35..eb1074dbc 100644 --- a/libc/calls/sig.c +++ b/libc/calls/sig.c @@ -29,6 +29,8 @@ struct Signals __sig; // TODO(jart): Need TLS +#define GetSigBit(XXSIG) (1ull << (((XXSIG)-1) & 63)) + /** * Changes signal mask for main thread. * @return 0 on success, or -1 w/ errno @@ -51,7 +53,7 @@ textwindows int __sig_mask(int how, const sigset_t *neu, sigset_t *old) { __sig.mask.__bits[i] = neu->__bits[i]; } } - __sig.mask.__bits[0] &= ~(SIGKILL | SIGSTOP); + __sig.mask.__bits[0] &= ~(GetSigBit(SIGKILL) | GetSigBit(SIGSTOP)); } __sig_unlock(); return 0; @@ -59,3 +61,5 @@ textwindows int __sig_mask(int how, const sigset_t *neu, sigset_t *old) { return einval(); } } + +#undef GetSigBit diff --git a/test/libc/calls/sigprocmask_test.c b/test/libc/calls/sigprocmask_test.c index 1b155fbc5..aff4a62f0 100644 --- a/test/libc/calls/sigprocmask_test.c +++ b/test/libc/calls/sigprocmask_test.c @@ -78,3 +78,18 @@ TEST(sigprocmask, testMultipleBlockedDeliveriesOfSameSignal) { EXPECT_EQ(1, n); } } + +TEST(sigprocmask, testBlockingSIGINT) { + sigset_t neu, old; + struct sigaction oldsigint; + struct sigaction sa = {.sa_sigaction = OnSig, .sa_flags = SA_SIGINFO}; + n = 0; + sigemptyset(&neu); + sigaddset(&neu, SIGINT); + EXPECT_EQ(0, sigprocmask(SIG_BLOCK, &neu, &old)); + ASSERT_EQ(0, sigaction(SIGINT, &sa, &oldsigint)); + ASSERT_EQ(0, raise(SIGINT)); + EXPECT_EQ(0, n); + EXPECT_EQ(0, sigprocmask(SIG_SETMASK, &old, NULL)); + EXPECT_EQ(0, sigaction(SIGINT, &oldsigint, 0)); +}