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.
This commit is contained in:
Andreas Schwab 2024-03-11 15:13:09 +01:00
parent aeee41f1cf
commit 2173173d57
3 changed files with 20 additions and 9 deletions

View File

@ -89,6 +89,17 @@ do_test (void)
TEST_COMPARE (sigisemptyset (&set), 1); 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; return 0;
} }

View File

@ -54,7 +54,7 @@ static inline int
internal_sigisemptyset (const internal_sigset_t *set) internal_sigisemptyset (const internal_sigset_t *set)
{ {
int cnt = __NSIG_WORDS; int cnt = __NSIG_WORDS;
int ret = set->__val[--cnt]; unsigned long int ret = set->__val[--cnt];
while (ret == 0 && --cnt >= 0) while (ret == 0 && --cnt >= 0)
ret = set->__val[cnt]; ret = set->__val[cnt];
return ret == 0; return ret == 0;
@ -82,7 +82,7 @@ static inline int
internal_sigismember (const internal_sigset_t *set, int sig) internal_sigismember (const internal_sigset_t *set, int sig)
{ {
unsigned long int mask = __sigmask (sig); unsigned long int mask = __sigmask (sig);
unsigned long int word = __sigword (sig); int word = __sigword (sig);
return set->__val[word] & mask ? 1 : 0; return set->__val[word] & mask ? 1 : 0;
} }
@ -90,7 +90,7 @@ static inline void
internal_sigaddset (internal_sigset_t *set, int sig) internal_sigaddset (internal_sigset_t *set, int sig)
{ {
unsigned long int mask = __sigmask (sig); unsigned long int mask = __sigmask (sig);
unsigned long int word = __sigword (sig); int word = __sigword (sig);
set->__val[word] |= mask; set->__val[word] |= mask;
} }
@ -98,7 +98,7 @@ static inline void
internal_sigdelset (internal_sigset_t *set, int sig) internal_sigdelset (internal_sigset_t *set, int sig)
{ {
unsigned long int mask = __sigmask (sig); unsigned long int mask = __sigmask (sig);
unsigned long int word = __sigword (sig); int word = __sigword (sig);
set->__val[word] &= ~mask; set->__val[word] &= ~mask;
} }

View File

@ -28,7 +28,7 @@
(1UL << (((sig) - 1) % ULONG_WIDTH)) (1UL << (((sig) - 1) % ULONG_WIDTH))
/* Return the word index for SIG. */ /* Return the word index for SIG. */
static inline unsigned long int static inline int
__sigword (int sig) __sigword (int sig)
{ {
return (sig - 1) / ULONG_WIDTH; return (sig - 1) / ULONG_WIDTH;
@ -66,7 +66,7 @@ static inline int
__sigisemptyset (const sigset_t *set) __sigisemptyset (const sigset_t *set)
{ {
int cnt = __NSIG_WORDS; int cnt = __NSIG_WORDS;
int ret = set->__val[--cnt]; unsigned long int ret = set->__val[--cnt];
while (ret == 0 && --cnt >= 0) while (ret == 0 && --cnt >= 0)
ret = set->__val[cnt]; ret = set->__val[cnt];
return ret == 0; return ret == 0;
@ -92,7 +92,7 @@ static inline int
__sigismember (const sigset_t *set, int sig) __sigismember (const sigset_t *set, int sig)
{ {
unsigned long int mask = __sigmask (sig); unsigned long int mask = __sigmask (sig);
unsigned long int word = __sigword (sig); int word = __sigword (sig);
return set->__val[word] & mask ? 1 : 0; return set->__val[word] & mask ? 1 : 0;
} }
@ -100,7 +100,7 @@ static inline void
__sigaddset (sigset_t *set, int sig) __sigaddset (sigset_t *set, int sig)
{ {
unsigned long int mask = __sigmask (sig); unsigned long int mask = __sigmask (sig);
unsigned long int word = __sigword (sig); int word = __sigword (sig);
set->__val[word] |= mask; set->__val[word] |= mask;
} }
@ -108,7 +108,7 @@ static inline void
__sigdelset (sigset_t *set, int sig) __sigdelset (sigset_t *set, int sig)
{ {
unsigned long int mask = __sigmask (sig); unsigned long int mask = __sigmask (sig);
unsigned long int word = __sigword (sig); int word = __sigword (sig);
set->__val[word] &= ~mask; set->__val[word] &= ~mask;
} }