From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2138) id AB25E385840B; Tue, 12 Mar 2024 09:01:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AB25E385840B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1710234093; bh=qASqyf0NtbQT7rZ51GkrYWtUUiklM7c7GfrE64XSuVM=; h=From:To:Subject:Date:From; b=GEtF59rFj+g0l4kHz+PijNqJBc283cGuCySji4Y80WD2/qcjrWFMWhTqOKTCsTsXG nA2IuyjAE8gwtFvq1C9G76aUZnABbUN8OD4PnxJc2F7E+WDf2EKGHhk1CO8wNnqf2Q DnurHpUKeeCLcI+YY8ySYO/YeIIL8A3u3jw4rWJw= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Andreas Schwab To: glibc-cvs@sourceware.org Subject: [glibc] linux/sigsetops: fix type confusion (bug 31468) X-Act-Checkin: glibc X-Git-Author: Andreas Schwab X-Git-Refname: refs/heads/master X-Git-Oldrev: aeee41f1cf9bf58d3d316af36bb7f5a8699ab129 X-Git-Newrev: 2173173d57971d042c0ad4b281431ae127e9b5b8 Message-Id: <20240312090133.AB25E385840B@sourceware.org> Date: Tue, 12 Mar 2024 09:01:33 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=2173173d57971d042c0ad4b281431ae127e9b5b8 commit 2173173d57971d042c0ad4b281431ae127e9b5b8 Author: Andreas Schwab Date: Mon Mar 11 15:13:09 2024 +0100 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. Diff: --- 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; }