Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
glibc
sigisemptyset.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File sigisemptyset.patch of Package glibc
From 2173173d57971d042c0ad4b281431ae127e9b5b8 Mon Sep 17 00:00:00 2001 From: Andreas Schwab <schwab@suse.de> Date: Mon, 11 Mar 2024 15:13:09 +0100 Subject: [PATCH] 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. --- signal/tst-sigisemptyset.c | 11 +++++++++++ sysdeps/unix/sysv/linux/internal-sigset.h | 8 ++++---- 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; } -- 2.44.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor