lkml.org 
[lkml]   [2011]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[17/71] Relax si_code check in rt_sigqueueinfo and rt_tgsigqueueinfo
    2.6.33-longterm review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Roland Dreier <roland@purestorage.com>

    commit 243b422af9ea9af4ead07a8ad54c90d4f9b6081a upstream.

    Commit da48524eb206 ("Prevent rt_sigqueueinfo and rt_tgsigqueueinfo
    from spoofing the signal code") made the check on si_code too strict.
    There are several legitimate places where glibc wants to queue a
    negative si_code different from SI_QUEUE:

    - This was first noticed with glibc's aio implementation, which wants
    to queue a signal with si_code SI_ASYNCIO; the current kernel
    causes glibc's tst-aio4 test to fail because rt_sigqueueinfo()
    fails with EPERM.

    - Further examination of the glibc source shows that getaddrinfo_a()
    wants to use SI_ASYNCNL (which the kernel does not even define).
    The timer_create() fallback code wants to queue signals with SI_TIMER.

    As suggested by Oleg Nesterov <oleg@redhat.com>, loosen the check to
    forbid only the problematic SI_TKILL case.

    Reported-by: Klaus Dittrich <kladit@arcor.de>
    Acked-by: Julien Tinnes <jln@google.com>
    Signed-off-by: Roland Dreier <roland@purestorage.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    kernel/signal.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/kernel/signal.c
    +++ b/kernel/signal.c
    @@ -2408,7 +2408,7 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t,
    /* Not even root can pretend to send signals from the kernel.
    * Nor can they impersonate a kill()/tgkill(), which adds source info.
    */
    - if (info.si_code != SI_QUEUE) {
    + if (info.si_code >= 0 || info.si_code == SI_TKILL) {
    /* We used to allow any < 0 si_code */
    WARN_ON_ONCE(info.si_code < 0);
    return -EPERM;
    @@ -2428,7 +2428,7 @@ long do_rt_tgsigqueueinfo(pid_t tgid, pi
    /* Not even root can pretend to send signals from the kernel.
    * Nor can they impersonate a kill()/tgkill(), which adds source info.
    */
    - if (info->si_code != SI_QUEUE) {
    + if (info->si_code >= 0 || info->si_code == SI_TKILL) {
    /* We used to allow any < 0 si_code */
    WARN_ON_ONCE(info->si_code < 0);
    return -EPERM;



    \
     
     \ /
      Last update: 2011-04-13 18:15    [W:0.022 / U:0.248 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site