| author | |
| committer | |
| log | 2eccd7e28d8cd9d8df344cd85165c3c22de5d0d9 |
| tree | 6901b4f91a7969c9ab43c2200351c2c3713e6141 |
| parent | 379ce1f0f10ab8391ac59b32e5dc7e149d0d3f43 |
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 { |
| 2752 | 2752 | |
| 2753 | 2753 | pub fn sigdelset(set: *sigset_t, sig: SIG) void { |
| 2754 | 2754 | const index = sigset_bit_index(sig); |
| 2755 | (set.*)[index.word] ^= index.mask; | |
| 2755 | (set.*)[index.word] &= ~index.mask; | |
| 2756 | 2756 | } |
| 2757 | 2757 | |
| 2758 | 2758 | pub fn sigismember(set: *const sigset_t, sig: SIG) bool { |
lib/std/os/linux/test.zig+8| ... | ... | @@ -159,6 +159,14 @@ test "sigset_t" { |
| 159 | 159 | } |
| 160 | 160 | } |
| 161 | 161 | |
| 162 | test "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 | ||
| 162 | 170 | test "sigfillset" { |
| 163 | 171 | // unlike the C library, all the signals are set in the kernel-level fillset |
| 164 | 172 | const sigset = linux.sigfillset(); |