summaryrefslogtreecommitdiff
path: root/nptl/pthread_sigmask.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2020-03-12 09:50:19 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2020-04-21 15:10:10 -0300
commit566e10aa7292bacd74d229ca6f2cd9e8c8ba8748 (patch)
tree8418dc7134fe1223d7f74db7d602521a4b5afa11 /nptl/pthread_sigmask.c
parent2f6fa80147f0cf74c0d411a0e07c5655deb436b3 (diff)
downloadglibc-566e10aa7292bacd74d229ca6f2cd9e8c8ba8748.tar.gz
signal: Only handle on NSIG signals on signal functions (BZ #25657)
The upper bits of the sigset_t s not fully initialized in the signal mask calls that return information from kernel (sigprocmask, sigpending, and pthread_sigmask), since the exported sigset_t size (1024 bits) is larger than Linux support one (64 or 128 bits). It might make sigisemptyset/sigorset/sigandset fail if the mask is filled prior the call. This patch changes the internal signal function to handle up to supported Linux signal number (_NSIG), the remaining bits are untouched. Checked on x86_64-linux-gnu and i686-linux-gnu.
Diffstat (limited to 'nptl/pthread_sigmask.c')
-rw-r--r--nptl/pthread_sigmask.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/nptl/pthread_sigmask.c b/nptl/pthread_sigmask.c
index c6c6e83c08..d266d296c5 100644
--- a/nptl/pthread_sigmask.c
+++ b/nptl/pthread_sigmask.c
@@ -29,12 +29,11 @@ __pthread_sigmask (int how, const sigset_t *newmask, sigset_t *oldmask)
/* The only thing we have to make sure here is that SIGCANCEL and
SIGSETXID is not blocked. */
if (newmask != NULL
- && (__builtin_expect (__sigismember (newmask, SIGCANCEL), 0)
- || __builtin_expect (__sigismember (newmask, SIGSETXID), 0)))
+ && (__glibc_unlikely (__sigismember (newmask, SIGCANCEL))
+ || __glibc_unlikely (__sigismember (newmask, SIGSETXID))))
{
local_newmask = *newmask;
- __sigdelset (&local_newmask, SIGCANCEL);
- __sigdelset (&local_newmask, SIGSETXID);
+ __clear_internal_signals (&local_newmask);
newmask = &local_newmask;
}