From 566e10aa7292bacd74d229ca6f2cd9e8c8ba8748 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 12 Mar 2020 09:50:19 -0300 Subject: 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. --- nptl/pthread_sigmask.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'nptl/pthread_sigmask.c') 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; } -- cgit v1.2.1