Commit ce0ee4e6 authored by Eric W. Biederman's avatar Eric W. Biederman

signal/sh: Use force_sig(SIGKILL) instead of do_group_exit(SIGKILL)

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: 0ea820cf ("sh: Move over to dynamically allocated FPU context.")
Link: https://lkml.kernel.org/r/20211020174406.17889-6-ebiederm@xmission.comSigned-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
parent 95bf9d64
...@@ -62,18 +62,20 @@ void fpu_state_restore(struct pt_regs *regs) ...@@ -62,18 +62,20 @@ void fpu_state_restore(struct pt_regs *regs)
} }
if (!tsk_used_math(tsk)) { if (!tsk_used_math(tsk)) {
local_irq_enable(); int ret;
/* /*
* does a slab alloc which can sleep * 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! * ran out of memory!
*/ */
do_group_exit(SIGKILL); force_sig(SIGKILL);
return; return;
} }
local_irq_disable();
} }
grab_fpu(regs); grab_fpu(regs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment