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);
}
{
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;
}

View File

@ -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;
}

View File

@ -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;
}