From 1bb9a9dafa1f7961e6bf7cf66bcf1a425eedc07e Mon Sep 17 00:00:00 2001 From: Yuming He Date: Thu, 22 Oct 2026 16:08:18 +0800 Subject: [PATCH] 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 --- lib/std/os/linux.zig | 2 +- lib/std/os/linux/test.zig | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 38e4abd197ba6c17245e7fe7038d7db0528ca395..16ae6587fb53f17e1ac6492431be4de75e7c1cbd 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -2774,7 +2774,7 @@ pub fn sigaddset(set: *sigset_t, sig: SIG) void { pub fn sigdelset(set: *sigset_t, sig: SIG) void { const index = sigset_bit_index(sig); - (set.*)[index.word] ^= index.mask; + (set.*)[index.word] &= ~index.mask; } pub fn sigismember(set: *const sigset_t, sig: SIG) bool { diff --git a/lib/std/os/linux/test.zig b/lib/std/os/linux/test.zig index 1a22e8f24a264d960040adde43a0070dc9d2fc96..552db88825d8c1a7d697b723cfc57f1d8a9abc72 100644 --- a/lib/std/os/linux/test.zig +++ b/lib/std/os/linux/test.zig @@ -159,6 +159,14 @@ test "sigset_t" { } } +test "sigdelset" { + var set = linux.sigemptyset(); + + // Deleting an absent signal must leave it absent. + linux.sigdelset(&set, linux.SIG.USR1); + try expectEqual(false, linux.sigismember(&set, linux.SIG.USR1)); +} + test "sigfillset" { // unlike the C library, all the signals are set in the kernel-level fillset const sigset = linux.sigfillset(); -- 2.54.0