lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 20 Dec 2022 17:14:05 +1000 From: "Nicholas Piggin" <npiggin@...il.com> To: "Nicholas Piggin" <npiggin@...il.com>, "Eric W. Biederman" <ebiederm@...ssion.com> Cc: <linux-kernel@...r.kernel.org>, "Michael Ellerman" <mpe@...erman.id.au> Subject: Re: [PATCH] exit: Detect and fix irq disabled state in oops On Tue Oct 4, 2022 at 7:44 PM AEST, Nicholas Piggin wrote: > If a task oopses with irqs disabled, this can cause various cascading > problems in the oops path such as sleep-from-invalid warnings, and > potentially worse. > > Since commit 0258b5fd7c712 ("coredump: Limit coredumps to a single > thread group"), the unconditional irq enable in coredump_task_exit() > will "fix" the irq state to be enabled early in do_exit(), so currently > this may not be triggerable, but that is coincidental and fragile. > > Detect and fix the irqs_disabled() condition in the oops path before > calling do_exit(), similarly to the way in_atomic() is handled. > > Reported-by: Michael Ellerman <mpe@...erman.id.au> > Signed-off-by: Nicholas Piggin <npiggin@...il.com> Hey Eric, did you have any thoughts on this? Thanks, Nick > --- > kernel/exit.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/kernel/exit.c b/kernel/exit.c > index 84021b24f79e..fa696765f694 100644 > --- a/kernel/exit.c > +++ b/kernel/exit.c > @@ -738,6 +738,7 @@ void __noreturn do_exit(long code) > struct task_struct *tsk = current; > int group_dead; > > + WARN_ON(irqs_disabled()); > WARN_ON(tsk->plug); > > kcov_task_exit(tsk); > @@ -865,6 +866,11 @@ void __noreturn make_task_dead(int signr) > if (unlikely(!tsk->pid)) > panic("Attempted to kill the idle task!"); > > + if (unlikely(irqs_disabled())) { > + pr_info("note: %s[%d] exited with irqs disabled\n", > + current->comm, task_pid_nr(current)); > + local_irq_enable(); > + } > if (unlikely(in_atomic())) { > pr_info("note: %s[%d] exited with preempt_count %d\n", > current->comm, task_pid_nr(current), > -- > 2.37.2
Powered by blists - more mailing lists