From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 76136 invoked by alias); 3 Apr 2018 16:14:05 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 76127 invoked by uid 89); 3 Apr 2018 16:14:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.0 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f195.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:autocrypt :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=rrfiY2NxxJZcwe0VqOYcVaNS3DSpz1O3pGNzIsmDgvU=; b=RDE/KQ6ki5U6buOB3CJn/jpv3Rhcwn+8DdED8H7p+35/mWSxhfSVeQOwWBAoCgPsek m4MNQMge/wFUeWo+oGHq1C29fRzMpAaRAAU0pToJ+lBw3qVf1QQn8Y2bhkNSinhQcgIv 8mg49VZsDc5+4FC9yhZ8hURkVKz5ksTC+Cjy8tB8IqMh0e0T6mJdnU0kw9iesxk7fGHg 6Ubv9aAhm/wlAigy2TSbOxRv18UhXrv/psAABVhHkRg8oL4/qk/XoTMQQxpwNDz6NG3X 4X3QgJ3vorTJAxrqUgiEaOPq5w/ot4Nuw70Y856WEUhRsvD2FvCV8cC+Ln7oTsN+nmYT BCfA== X-Gm-Message-State: ALQs6tBe+nuI0KeOlCPPNHVo2JLiQnE9w2NeIOJat81gHHFtOYK0ca4Q OsQM0YZUL/HJT7I5tT1eUJgDwy8WHgc= X-Google-Smtp-Source: AIpwx4+mHHMwttm31jgoYYalLNxuGJtc/GsAT1nh7Wq0lHwmuvJ7SdUu6vgiQgbhVO+NpdG//xOzBQ== X-Received: by 10.200.40.37 with SMTP id 34mr20371602qtq.111.1522772039147; Tue, 03 Apr 2018 09:13:59 -0700 (PDT) Subject: Re: [PATCH v4 2/4] Filter out NPTL internal signals (BZ #22391) To: Zack Weinberg Cc: GNU C Library References: <1518439345-6013-1-git-send-email-adhemerval.zanella@linaro.org> <1518439345-6013-2-git-send-email-adhemerval.zanella@linaro.org> <43cc9193-1cea-6ae3-388e-88bb3406ac9c@linaro.org> <4a423a86-4de3-1830-4c06-d034282fbaed@linaro.org> From: Adhemerval Zanella Openpgp: preference=signencrypt Autocrypt: addr=adhemerval.zanella@linaro.org; keydata= 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 Message-ID: Date: Tue, 03 Apr 2018 16:14:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2018-04/txt/msg00065.txt.bz2 Right, I will fix it. On 03/04/2018 12:12, Zack Weinberg wrote: > LGTM except I think sysdeps/generic/internal-signals.h should define > all of the functions that sysdeps/u/s/l/internal-signals.h does. > > On Tue, Apr 3, 2018 at 10:24 AM, Adhemerval Zanella > wrote: >> If no one opposes, I will commit this shortly. >> >> On 19/02/2018 14:50, Adhemerval Zanella wrote: >>> Ping. >>> >>> On 12/02/2018 10:42, Adhemerval Zanella wrote: >>>> This patch filters out the internal NPTL signals (SIGCANCEL/SIGTIMER and >>>> SIGSETXID) from signal functions. GLIBC on Linux requires both signals to >>>> proper implement pthread cancellation, posix timers, and set*id posix >>>> thread synchronization. >>>> >>>> And not filtering out the internal signal is troublesome: >>>> >>>> - A conformant program on a architecture that does not filter out the >>>> signals might inadvertently disable pthread asynchronous cancellation, >>>> set*id synchronization or posix timers. >>>> >>>> - It might also to security issues if SIGSETXID is masked and set*id >>>> functions are called (some threads might have effective user or group >>>> id different from the rest). >>>> >>>> The changes are basically: >>>> >>>> - Change __is_internal_signal to bool and used on all signal function >>>> that has a signal number as input. Also for signal function which accepts >>>> signals sets (sigset_t) it assumes that canonical function were used to >>>> add/remove signals which lead to some input simplification. >>>> >>>> - Fix tst-sigset.c to avoid check for SIGCANCEL/SIGTIMER and SIGSETXID. >>>> It is rewritten to check each signal indidually and to check realtime >>>> signals using canonical macros. >>>> >>>> - Add generic __clear_internal_signals and __is_internal_signal >>>> version since both symbols are used on generic implementations. >>>> >>>> - Remove superflous sysdeps/nptl/sigfillset.c. >>>> >>>> - Remove superflous SIGTIMER handling on Linux __is_internal_signal >>>> since it is the same of SIGCANCEL. >>>> >>>> - Remove dangling define and obvious comment on nptl/sigaction.c. >>>> >>>> Checked on x86_64-linux-gnu. >>>> >>>> [BZ #22391] >>>> * nptl/sigaction.c (__sigaction): Use __is_internal_signal to >>>> check for internal nptl signals. >>>> * signal/sigaddset.c (sigaddset): Likewise. >>>> * signal/sigdelset.c (sigdelset): Likewise. >>>> * sysdeps/posix/signal.c (__bsd_signal): Likewise. >>>> * sysdeps/posix/sigset.c (sigset): Call and check sigaddset return >>>> value. >>>> * signal/sigfillset.c (sigfillset): User __clear_internal_signals >>>> to filter out internal nptl signals. >>>> * signal/tst-sigset.c (do_test): Check ech signal indidually and >>>> also check realtime signals using standard macros. >>>> * sysdeps/nptl/nptl-signals.h (__clear_internal_signals, >>>> __is_internal_signal): New functions. >>>> * sysdeps/nptl/sigfillset.c: Remove file. >>>> * sysdeps/unix/sysv/linux/nptl-signals.h (__is_internal_signal): >>>> Change return to bool. >>>> (__clear_internal_signals): Remove SIGTIMER clean since it is >>>> equal to SIGCANEL on Linux. >>>> * sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Assume >>>> signal set was constructed using standard functions. >>>> * sysdeps/unix/sysv/linux/sigwait.c (do_sigtwait): Likewise. >>>> >>>> Signed-off-by: Adhemerval Zanella >>>> Reported-by: Yury Norov >>>> --- >>>> ChangeLog | 23 ++++++++ >>>> nptl/sigaction.c | 14 +---- >>>> signal/sigaction.c | 2 +- >>>> signal/sigaddset.c | 5 +- >>>> signal/sigdelset.c | 5 +- >>>> signal/sigfillset.c | 10 +--- >>>> signal/tst-sigset.c | 92 ++++++++++++++++++++++-------- >>>> sysdeps/generic/internal-signals.h | 11 ++++ >>>> sysdeps/nptl/sigfillset.c | 20 ------- >>>> sysdeps/posix/signal.c | 5 +- >>>> sysdeps/posix/sigset.c | 10 +--- >>>> sysdeps/unix/sysv/linux/internal-signals.h | 4 +- >>>> sysdeps/unix/sysv/linux/sigtimedwait.c | 17 +----- >>>> 13 files changed, 122 insertions(+), 96 deletions(-) >>>> delete mode 100644 sysdeps/nptl/sigfillset.c >>>> >>>> diff --git a/nptl/sigaction.c b/nptl/sigaction.c >>>> index ddf6f5e..79b6fdc 100644 >>>> --- a/nptl/sigaction.c >>>> +++ b/nptl/sigaction.c >>>> @@ -16,22 +16,12 @@ >>>> License along with the GNU C Library; if not, see >>>> . */ >>>> >>>> - >>>> -/* This is no complete implementation. The file is meant to be >>>> - included in the real implementation to provide the wrapper around >>>> - __libc_sigaction. */ >>>> - >>>> -#include >>>> - >>>> -/* We use the libc implementation but we tell it to not allow >>>> - SIGCANCEL or SIGTIMER to be handled. */ >>>> -#define LIBC_SIGACTION 1 >>>> - >>>> +#include >>>> >>>> int >>>> __sigaction (int sig, const struct sigaction *act, struct sigaction *oact) >>>> { >>>> - if (__glibc_unlikely (sig == SIGCANCEL || sig == SIGSETXID)) >>>> + if (sig <= 0 || sig >= NSIG || __is_internal_signal (sig)) >>>> { >>>> __set_errno (EINVAL); >>>> return -1; >>>> diff --git a/signal/sigaction.c b/signal/sigaction.c >>>> index f761ca2..c99001a 100644 >>>> --- a/signal/sigaction.c >>>> +++ b/signal/sigaction.c >>>> @@ -24,7 +24,7 @@ >>>> int >>>> __sigaction (int sig, const struct sigaction *act, struct sigaction *oact) >>>> { >>>> - if (sig <= 0 || sig >= NSIG) >>>> + if (sig <= 0 || sig >= NSIG || __is_internal_signal (sig)) >>>> { >>>> __set_errno (EINVAL); >>>> return -1; >>>> diff --git a/signal/sigaddset.c b/signal/sigaddset.c >>>> index d310890..7238df4 100644 >>>> --- a/signal/sigaddset.c >>>> +++ b/signal/sigaddset.c >>>> @@ -17,13 +17,14 @@ >>>> >>>> #include >>>> #include >>>> -#include >>>> +#include >>>> >>>> /* Add SIGNO to SET. */ >>>> int >>>> sigaddset (sigset_t *set, int signo) >>>> { >>>> - if (set == NULL || signo <= 0 || signo >= NSIG) >>>> + if (set == NULL || signo <= 0 || signo >= NSIG >>>> + || __is_internal_signal (signo)) >>>> { >>>> __set_errno (EINVAL); >>>> return -1; >>>> diff --git a/signal/sigdelset.c b/signal/sigdelset.c >>>> index cd83dda..011978c 100644 >>>> --- a/signal/sigdelset.c >>>> +++ b/signal/sigdelset.c >>>> @@ -17,13 +17,14 @@ >>>> >>>> #include >>>> #include >>>> -#include >>>> +#include >>>> >>>> /* Add SIGNO to SET. */ >>>> int >>>> sigdelset (sigset_t *set, int signo) >>>> { >>>> - if (set == NULL || signo <= 0 || signo >= NSIG) >>>> + if (set == NULL || signo <= 0 || signo >= NSIG >>>> + || __is_internal_signal (signo)) >>>> { >>>> __set_errno (EINVAL); >>>> return -1; >>>> diff --git a/signal/sigfillset.c b/signal/sigfillset.c >>>> index e586fd9..83dd583 100644 >>>> --- a/signal/sigfillset.c >>>> +++ b/signal/sigfillset.c >>>> @@ -18,6 +18,7 @@ >>>> #include >>>> #include >>>> #include >>>> +#include >>>> >>>> /* Set all signals in SET. */ >>>> int >>>> @@ -31,14 +32,7 @@ sigfillset (sigset_t *set) >>>> >>>> memset (set, 0xff, sizeof (sigset_t)); >>>> >>>> - /* If the implementation uses a cancellation signal don't set the bit. */ >>>> -#ifdef SIGCANCEL >>>> - __sigdelset (set, SIGCANCEL); >>>> -#endif >>>> - /* Likewise for the signal to implement setxid. */ >>>> -#ifdef SIGSETXID >>>> - __sigdelset (set, SIGSETXID); >>>> -#endif >>>> + __clear_internal_signals (set); >>>> >>>> return 0; >>>> } >>>> diff --git a/signal/tst-sigset.c b/signal/tst-sigset.c >>>> index d47adcc..a2b764d 100644 >>>> --- a/signal/tst-sigset.c >>>> +++ b/signal/tst-sigset.c >>>> @@ -1,43 +1,85 @@ >>>> /* Test sig*set functions. */ >>>> >>>> #include >>>> -#include >>>> >>>> -#define TEST_FUNCTION do_test () >>>> +#include >>>> + >>>> static int >>>> do_test (void) >>>> { >>>> - int result = 0; >>>> - int sig = -1; >>>> + sigset_t set; >>>> + TEST_VERIFY (sigemptyset (&set) == 0); >>>> >>>> -#define TRY(call) \ >>>> - if (call) \ >>>> - { \ >>>> - printf ("%s (sig = %d): %m\n", #call, sig); \ >>>> - result = 1; \ >>>> - } \ >>>> - else >>>> +#define VERIFY(set, sig) \ >>>> + TEST_VERIFY (sigismember (&set, sig) == 0); \ >>>> + TEST_VERIFY (sigaddset (&set, sig) == 0); \ >>>> + TEST_VERIFY (sigismember (&set, sig) != 0); \ >>>> + TEST_VERIFY (sigdelset (&set, sig) == 0); \ >>>> + TEST_VERIFY (sigismember (&set, sig) == 0) >>>> >>>> + /* ISO C99 signals. */ >>>> + VERIFY (set, SIGINT); >>>> + VERIFY (set, SIGILL); >>>> + VERIFY (set, SIGABRT); >>>> + VERIFY (set, SIGFPE); >>>> + VERIFY (set, SIGSEGV); >>>> + VERIFY (set, SIGTERM); >>>> >>>> - sigset_t set; >>>> - TRY (sigemptyset (&set) != 0); >>>> + /* Historical signals specified by POSIX. */ >>>> + VERIFY (set, SIGHUP); >>>> + VERIFY (set, SIGQUIT); >>>> + VERIFY (set, SIGTRAP); >>>> + VERIFY (set, SIGKILL); >>>> + VERIFY (set, SIGBUS); >>>> + VERIFY (set, SIGSYS); >>>> + VERIFY (set, SIGPIPE); >>>> + VERIFY (set, SIGALRM); >>>> + >>>> + /* New(er) POSIX signals (1003.1-2008, 1003.1-2013). */ >>>> + VERIFY (set, SIGURG); >>>> + VERIFY (set, SIGSTOP); >>>> + VERIFY (set, SIGTSTP); >>>> + VERIFY (set, SIGCONT); >>>> + VERIFY (set, SIGCHLD); >>>> + VERIFY (set, SIGTTIN); >>>> + VERIFY (set, SIGTTOU); >>>> + VERIFY (set, SIGPOLL); >>>> + VERIFY (set, SIGXCPU); >>>> + VERIFY (set, SIGXFSZ); >>>> + VERIFY (set, SIGVTALRM); >>>> + VERIFY (set, SIGPROF); >>>> + VERIFY (set, SIGUSR1); >>>> + VERIFY (set, SIGUSR2); >>>> + >>>> + /* Nonstandard signals found in all modern POSIX systems >>>> + (including both BSD and Linux). */ >>>> + VERIFY (set, SIGWINCH); >>>> >>>> -#ifdef SIGRTMAX >>>> - int max_sig = SIGRTMAX; >>>> -#else >>>> - int max_sig = NSIG - 1; >>>> + /* Arch-specific signals. */ >>>> +#ifdef SIGEMT >>>> + VERIFY (set, SIGEMT); >>>> +#endif >>>> +#ifdef SIGLOST >>>> + VERIFY (set, SIGLOST); >>>> +#endif >>>> +#ifdef SIGINFO >>>> + VERIFY (set, SIGINFO); >>>> +#endif >>>> +#ifdef SIGSTKFLT >>>> + VERIFY (set, SIGSTKFLT); >>>> +#endif >>>> +#ifdef SIGPWR >>>> + VERIFY (set, SIGPWR); >>>> #endif >>>> >>>> - for (sig = 1; sig <= max_sig; ++sig) >>>> + /* Read-time signals (POSIX.1b real-time extensions). If they are >>>> + supported SIGRTMAX value is greater than SIGRTMIN. */ >>>> + for (int rtsig = SIGRTMIN; rtsig <= SIGRTMAX; rtsig++) >>>> { >>>> - TRY (sigismember (&set, sig) != 0); >>>> - TRY (sigaddset (&set, sig) != 0); >>>> - TRY (sigismember (&set, sig) == 0); >>>> - TRY (sigdelset (&set, sig) != 0); >>>> - TRY (sigismember (&set, sig) != 0); >>>> + VERIFY (set, rtsig); >>>> } >>>> >>>> - return result; >>>> + return 0; >>>> } >>>> >>>> -#include "../test-skeleton.c" >>>> +#include >>>> diff --git a/sysdeps/generic/internal-signals.h b/sysdeps/generic/internal-signals.h >>>> index 01e5b75..ab0b22e 100644 >>>> --- a/sysdeps/generic/internal-signals.h >>>> +++ b/sysdeps/generic/internal-signals.h >>>> @@ -15,3 +15,14 @@ >>>> You should have received a copy of the GNU Lesser General Public >>>> License along with the GNU C Library; if not, see >>>> . */ >>>> + >>>> +static inline void >>>> +__clear_internal_signals (sigset_t *set) >>>> +{ >>>> +} >>>> + >>>> +static inline bool >>>> +__is_internal_signal (int sig) >>>> +{ >>>> + return false; >>>> +} >>>> diff --git a/sysdeps/nptl/sigfillset.c b/sysdeps/nptl/sigfillset.c >>>> deleted file mode 100644 >>>> index 94a7680..0000000 >>>> --- a/sysdeps/nptl/sigfillset.c >>>> +++ /dev/null >>>> @@ -1,20 +0,0 @@ >>>> -/* Copyright (C) 2003-2018 Free Software Foundation, Inc. >>>> - This file is part of the GNU C Library. >>>> - >>>> - The GNU C Library is free software; you can redistribute it and/or >>>> - modify it under the terms of the GNU Lesser General Public >>>> - License as published by the Free Software Foundation; either >>>> - version 2.1 of the License, or (at your option) any later version. >>>> - >>>> - The GNU C Library is distributed in the hope that it will be useful, >>>> - but WITHOUT ANY WARRANTY; without even the implied warranty of >>>> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >>>> - Lesser General Public License for more details. >>>> - >>>> - You should have received a copy of the GNU Lesser General Public >>>> - License along with the GNU C Library; if not, see >>>> - . */ >>>> - >>>> -#include >>>> - >>>> -#include >>>> diff --git a/sysdeps/posix/signal.c b/sysdeps/posix/signal.c >>>> index a4a0875..8a135c7 100644 >>>> --- a/sysdeps/posix/signal.c >>>> +++ b/sysdeps/posix/signal.c >>>> @@ -18,8 +18,8 @@ >>>> >>>> #include >>>> #include >>>> -#include /* For the real memset prototype. */ >>>> #include >>>> +#include >>>> >>>> sigset_t _sigintr attribute_hidden; /* Set by siginterrupt. */ >>>> >>>> @@ -31,7 +31,8 @@ __bsd_signal (int sig, __sighandler_t handler) >>>> struct sigaction act, oact; >>>> >>>> /* Check signal extents to protect __sigismember. */ >>>> - if (handler == SIG_ERR || sig < 1 || sig >= NSIG) >>>> + if (handler == SIG_ERR || sig < 1 || sig >= NSIG >>>> + || __is_internal_signal (sig)) >>>> { >>>> __set_errno (EINVAL); >>>> return SIG_ERR; >>>> diff --git a/sysdeps/posix/sigset.c b/sysdeps/posix/sigset.c >>>> index b62aa3c..6ab4a48 100644 >>>> --- a/sysdeps/posix/sigset.c >>>> +++ b/sysdeps/posix/sigset.c >>>> @@ -31,15 +31,9 @@ sigset (int sig, __sighandler_t disp) >>>> sigset_t set; >>>> sigset_t oset; >>>> >>>> - /* Check signal extents to protect __sigismember. */ >>>> - if (disp == SIG_ERR || sig < 1 || sig >= NSIG) >>>> - { >>>> - __set_errno (EINVAL); >>>> - return SIG_ERR; >>>> - } >>>> - >>>> __sigemptyset (&set); >>>> - __sigaddset (&set, sig); >>>> + if (sigaddset (&set, sig) < 0) >>>> + return SIG_ERR; >>>> >>>> if (disp == SIG_HOLD) >>>> { >>>> diff --git a/sysdeps/unix/sysv/linux/internal-signals.h b/sysdeps/unix/sysv/linux/internal-signals.h >>>> index e007372..5ff4cf8 100644 >>>> --- a/sysdeps/unix/sysv/linux/internal-signals.h >>>> +++ b/sysdeps/unix/sysv/linux/internal-signals.h >>>> @@ -21,6 +21,8 @@ >>>> >>>> #include >>>> #include >>>> +#include >>>> +#include >>>> >>>> /* The signal used for asynchronous cancelation. */ >>>> #define SIGCANCEL __SIGRTMIN >>>> @@ -37,7 +39,7 @@ >>>> >>>> >>>> /* Return is sig is used internally. */ >>>> -static inline int >>>> +static inline bool >>>> __is_internal_signal (int sig) >>>> { >>>> return (sig == SIGCANCEL) || (sig == SIGSETXID); >>>> diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c >>>> index 051a285..b4de885 100644 >>>> --- a/sysdeps/unix/sysv/linux/sigtimedwait.c >>>> +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c >>>> @@ -24,21 +24,8 @@ int >>>> __sigtimedwait (const sigset_t *set, siginfo_t *info, >>>> const struct timespec *timeout) >>>> { >>>> - sigset_t tmpset; >>>> - if (set != NULL >>>> - && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) >>>> - || __builtin_expect (__sigismember (set, SIGSETXID), 0))) >>>> - { >>>> - /* Create a temporary mask without the bit for SIGCANCEL set. */ >>>> - // We are not copying more than we have to. >>>> - memcpy (&tmpset, set, _NSIG / 8); >>>> - __sigdelset (&tmpset, SIGCANCEL); >>>> - __sigdelset (&tmpset, SIGSETXID); >>>> - set = &tmpset; >>>> - } >>>> - >>>> - /* XXX The size argument hopefully will have to be changed to the >>>> - real size of the user-level sigset_t. */ >>>> + /* XXX The size argument hopefully will have to be changed to the >>>> + real size of the user-level sigset_t. */ >>>> int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, timeout, _NSIG / 8); >>>> >>>> /* The kernel generates a SI_TKILL code in si_code in case tkill is >>>>