authorgravatar for ComixHe1895@outlook.comYuming He <ComixHe1895@outlook.com> 2026-10-22 16:08:18+08:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-23 02:16:29+02:00
log1bb9a9dafa1f7961e6bf7cf66bcf1a425eedc07e
tree9d9c6d6dda4558408cdb9d35bfcaba61be2d499c
parentaf6c78e34498d63ad35a95d97d9e2c735638cbe8
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.os.linux: fix sigdelset to clear the bit

XOR only cleared the bit when the signal was already present. Deleting an absent signal set its bit instead, so the set gained a signal it never had. Match POSIX, glibc and musl by clearing the bit, and cover deleting an absent signal in the sigset tests. Signed-off-by: Yuming He <ComixHe1895@outlook.com>

2 files changed, 9 insertions(+), 1 deletions(-)

lib/std/os/linux.zig+1-1
......@@ -2774,7 +2774,7 @@ pub fn sigaddset(set: *sigset_t, sig: SIG) void {
27742774
27752775pub fn sigdelset(set: *sigset_t, sig: SIG) void {
27762776 const index = sigset_bit_index(sig);
2777 (set.*)[index.word] ^= index.mask;
2777 (set.*)[index.word] &= ~index.mask;
27782778}
27792779
27802780pub fn sigismember(set: *const sigset_t, sig: SIG) bool {
lib/std/os/linux/test.zig+8
......@@ -159,6 +159,14 @@ test "sigset_t" {
159159 }
160160}
161161
162test "sigdelset" {
163 var set = linux.sigemptyset();
164
165 // Deleting an absent signal must leave it absent.
166 linux.sigdelset(&set, linux.SIG.USR1);
167 try expectEqual(false, linux.sigismember(&set, linux.SIG.USR1));
168}
169
162170test "sigfillset" {
163171 // unlike the C library, all the signals are set in the kernel-level fillset
164172 const sigset = linux.sigfillset();