diff options
author | Andreas Schwab <schwab@suse.de> | 2024-03-11 15:13:09 +0100 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2024-03-12 10:00:22 +0100 |
commit | 2173173d57971d042c0ad4b281431ae127e9b5b8 (patch) | |
tree | 5adeba44bb88ebdb80cdf9f76d7a00f126efceff | |
parent | aeee41f1cf9bf58d3d316af36bb7f5a8699ab129 (diff) | |
download | glibc-2173173d57971d042c0ad4b281431ae127e9b5b8.tar.gz glibc-2173173d57971d042c0ad4b281431ae127e9b5b8.tar.xz glibc-2173173d57971d042c0ad4b281431ae127e9b5b8.zip |
linux/sigsetops: fix type confusion (bug 31468)
Each mask in the sigset array is an unsigned long, so fix __sigisemptyset to use that instead of int. The __sigword function returns a simple array index, so it can return int instead of unsigned long.
-rw-r--r-- | signal/tst-sigisemptyset.c | 11 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/internal-sigset.h | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sigsetops.h | 10 |
3 files changed, 20 insertions, 9 deletions
diff --git a/signal/tst-sigisemptyset.c b/signal/tst-sigisemptyset.c index f5e35e8c22..11e7f39d09 100644 --- a/signal/tst-sigisemptyset.c +++ b/signal/tst-sigisemptyset.c @@ -89,6 +89,17 @@ do_test (void) TEST_COMPARE (sigisemptyset (&set), 1); } + { + sigset_t set; + for (int sig = 1; sig <= NSIG; sig++) + { + sigemptyset (&set); + if (sigaddset (&set, sig) < 0) + continue; + TEST_COMPARE (sigisemptyset (&set), 0); + } + } + return 0; } diff --git a/sysdeps/unix/sysv/linux/internal-sigset.h b/sysdeps/unix/sysv/linux/internal-sigset.h index 3c21c3b6d5..5d7020b42d 100644 --- a/sysdeps/unix/sysv/linux/internal-sigset.h +++ b/sysdeps/unix/sysv/linux/internal-sigset.h @@ -54,7 +54,7 @@ static inline int internal_sigisemptyset (const internal_sigset_t *set) { int cnt = __NSIG_WORDS; - int ret = set->__val[--cnt]; + unsigned long int ret = set->__val[--cnt]; while (ret == 0 && --cnt >= 0) ret = set->__val[cnt]; return ret == 0; @@ -82,7 +82,7 @@ static inline int internal_sigismember (const internal_sigset_t *set, int sig) { unsigned long int mask = __sigmask (sig); - unsigned long int word = __sigword (sig); + int word = __sigword (sig); return set->__val[word] & mask ? 1 : 0; } @@ -90,7 +90,7 @@ static inline void internal_sigaddset (internal_sigset_t *set, int sig) { unsigned long int mask = __sigmask (sig); - unsigned long int word = __sigword (sig); + int word = __sigword (sig); set->__val[word] |= mask; } @@ -98,7 +98,7 @@ static inline void internal_sigdelset (internal_sigset_t *set, int sig) { unsigned long int mask = __sigmask (sig); - unsigned long int word = __sigword (sig); + int word = __sigword (sig); set->__val[word] &= ~mask; } diff --git a/sysdeps/unix/sysv/linux/sigsetops.h b/sysdeps/unix/sysv/linux/sigsetops.h index abd5576172..33db4f77b8 100644 --- a/sysdeps/unix/sysv/linux/sigsetops.h +++ b/sysdeps/unix/sysv/linux/sigsetops.h @@ -28,7 +28,7 @@ (1UL << (((sig) - 1) % ULONG_WIDTH)) /* Return the word index for SIG. */ -static inline unsigned long int +static inline int __sigword (int sig) { return (sig - 1) / ULONG_WIDTH; @@ -66,7 +66,7 @@ static inline int __sigisemptyset (const sigset_t *set) { int cnt = __NSIG_WORDS; - int ret = set->__val[--cnt]; + unsigned long int ret = set->__val[--cnt]; while (ret == 0 && --cnt >= 0) ret = set->__val[cnt]; return ret == 0; @@ -92,7 +92,7 @@ static inline int __sigismember (const sigset_t *set, int sig) { unsigned long int mask = __sigmask (sig); - unsigned long int word = __sigword (sig); + int word = __sigword (sig); return set->__val[word] & mask ? 1 : 0; } @@ -100,7 +100,7 @@ static inline void __sigaddset (sigset_t *set, int sig) { unsigned long int mask = __sigmask (sig); - unsigned long int word = __sigword (sig); + int word = __sigword (sig); set->__val[word] |= mask; } @@ -108,7 +108,7 @@ static inline void __sigdelset (sigset_t *set, int sig) { unsigned long int mask = __sigmask (sig); - unsigned long int word = __sigword (sig); + int word = __sigword (sig); set->__val[word] &= ~mask; } |