| From f454a916f29bed355a9c925bc39006571580c838 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 20 Oct 2021 12:43:52 -0500 |
| Subject: signal/sh: Use force_sig(SIGKILL) instead of do_group_exit(SIGKILL) |
| |
| 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 |
| |