lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 494/575] signal/sh: Use force_sig(SIGKILL) instead of do_group_exit(SIGKILL)
    Date
    From: Eric W. Biederman <ebiederm@xmission.com>

    [ Upstream commit ce0ee4e6ac99606f3945f4d47775544edc3f7985 ]

    Today the sh code allocates memory the first time a process uses
    the fpu. If that memory allocation fails, kill the affected task
    with force_sig(SIGKILL) rather than do_group_exit(SIGKILL).

    Calling do_group_exit from an exception handler can potentially lead
    to dead locks as do_group_exit is not designed to be called from
    interrupt context. Instead use force_sig(SIGKILL) to kill the
    userspace process. Sending signals in general and force_sig in
    particular has been tested from interrupt context so there should be
    no problems.

    Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
    Cc: Rich Felker <dalias@libc.org>
    Cc: linux-sh@vger.kernel.org
    Fixes: 0ea820cf9bf5 ("sh: Move over to dynamically allocated FPU context.")
    Link: https://lkml.kernel.org/r/20211020174406.17889-6-ebiederm@xmission.com
    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/sh/kernel/cpu/fpu.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    diff --git a/arch/sh/kernel/cpu/fpu.c b/arch/sh/kernel/cpu/fpu.c
    index ae354a2931e7e..fd6db0ab19288 100644
    --- a/arch/sh/kernel/cpu/fpu.c
    +++ b/arch/sh/kernel/cpu/fpu.c
    @@ -62,18 +62,20 @@ void fpu_state_restore(struct pt_regs *regs)
    }

    if (!tsk_used_math(tsk)) {
    - local_irq_enable();
    + int ret;
    /*
    * does a slab alloc which can sleep
    */
    - if (init_fpu(tsk)) {
    + local_irq_enable();
    + ret = init_fpu(tsk);
    + local_irq_disable();
    + if (ret) {
    /*
    * ran out of memory!
    */
    - do_group_exit(SIGKILL);
    + force_sig(SIGKILL);
    return;
    }
    - local_irq_disable();
    }

    grab_fpu(regs);
    --
    2.33.0


    \
     
     \ /
      Last update: 2022-09-17 16:12    [W:4.110 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site