]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
ARC: signal handling robustify
authorVineet Gupta <vgupta@synopsys.com>
Thu, 26 Mar 2015 05:44:41 +0000 (11:14 +0530)
committerSasha Levin <sasha.levin@oracle.com>
Thu, 23 Apr 2015 03:31:18 +0000 (23:31 -0400)
commit654acb340d5ee5fd6d8af00eb79c35ab4edc9570
tree21acf63736c9d6152f61463553d148cb3b115a8e
parentb0864666b2abb45a1441bd2725e77c982ea9c39d
ARC: signal handling robustify

[ Upstream commit e4140819dadc3624accac8294881bca8a3cba4ed ]

A malicious signal handler / restorer can DOS the system by fudging the
user regs saved on stack, causing weird things such as sigreturn returning
to user mode PC but cpu state still being kernel mode....

Ensure that in sigreturn path status32 always has U bit; any other bogosity
(gargbage PC etc) will be taken care of by normal user mode exceptions mechanisms.

Reproducer signal handler:

    void handle_sig(int signo, siginfo_t *info, void *context)
    {
ucontext_t *uc = context;
struct user_regs_struct *regs = &(uc->uc_mcontext.regs);

regs->scratch.status32 = 0;
    }

Before the fix, kernel would go off to weeds like below:

    --------->8-----------
    [ARCLinux]$ ./signal-test
    Path: /signal-test
    CPU: 0 PID: 61 Comm: signal-test Not tainted 4.0.0-rc5+ #65
    task: 8f177880 ti: 5ffe6000 task.ti: 8f15c000

    [ECR   ]: 0x00220200 => Invalid Write @ 0x00000010 by insn @ 0x00010698
    [EFA   ]: 0x00000010
    [BLINK ]: 0x2007c1ee
    [ERET  ]: 0x10698
    [STAT32]: 0x00000000 :                                   <--------
    BTA: 0x00010680  SP: 0x5ffe7e48  FP: 0x00000000
    LPS: 0x20003c6c LPE: 0x20003c70 LPC: 0x00000000
    ...
    --------->8-----------

Reported-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
arch/arc/kernel/signal.c