From 2eccd7e28d8cd9d8df344cd85165c3c22de5d0d9 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 7c18ef62011d3cd07a6612d78b652446ce602344..4f5da7ac1088ca7da201360372cb5d2b19d94c9a 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -2752,7 +2752,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