| author | |
| committer | |
| log | 1bb9a9dafa1f7961e6bf7cf66bcf1a425eedc07e |
| tree | 9d9c6d6dda4558408cdb9d35bfcaba61be2d499c |
| parent | af6c78e34498d63ad35a95d97d9e2c735638cbe8 |
| signature | Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM |
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 { | ... | @@ -2774,7 +2774,7 @@ pub fn sigaddset(set: *sigset_t, sig: SIG) void { |
| 2774 | 2774 | ||
| 2775 | pub fn sigdelset(set: *sigset_t, sig: SIG) void { | 2775 | pub fn sigdelset(set: *sigset_t, sig: SIG) void { |
| 2776 | const index = sigset_bit_index(sig); | 2776 | const index = sigset_bit_index(sig); |
| 2777 | (set.*)[index.word] ^= index.mask; | 2777 | (set.*)[index.word] &= ~index.mask; |
| 2778 | } | 2778 | } |
| 2779 | 2779 | ||
| 2780 | pub fn sigismember(set: *const sigset_t, sig: SIG) bool { | 2780 | 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,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 | test "sigfillset" { | 170 | test "sigfillset" { |
| 163 | // unlike the C library, all the signals are set in the kernel-level fillset | 171 | // unlike the C library, all the signals are set in the kernel-level fillset |
| 164 | const sigset = linux.sigfillset(); | 172 | const sigset = linux.sigfillset(); |