Skip to content

Commit

Permalink
Fix inability to add some signals to mask on NT (#596)
Browse files Browse the repository at this point in the history
  • Loading branch information
G4Vi committed Sep 7, 2022
1 parent d861d27 commit 5986408
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
6 changes: 5 additions & 1 deletion libc/calls/sig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -51,11 +53,13 @@ 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;
} else {
return einval();
}
}

#undef GetSigBit
15 changes: 15 additions & 0 deletions test/libc/calls/sigprocmask_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

0 comments on commit 5986408

Please sign in to comment.