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 01:08:16+02:00
log2eccd7e28d8cd9d8df344cd85165c3c22de5d0d9
tree6901b4f91a7969c9ab43c2200351c2c3713e6141
parent379ce1f0f10ab8391ac59b32e5dc7e149d0d3f43

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
......@@ -2752,7 +2752,7 @@ pub fn sigaddset(set: *sigset_t, sig: SIG) void {
27522752
27532753pub fn sigdelset(set: *sigset_t, sig: SIG) void {
27542754 const index = sigset_bit_index(sig);
2755 (set.*)[index.word] ^= index.mask;
2755 (set.*)[index.word] &= ~index.mask;
27562756}
27572757
27582758pub 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();