public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] exit: Use READ_ONCE() for all oops/warn limit reads
@ 2022-12-16 20:30 Kees Cook
  2022-12-19 11:39 ` Peter Zijlstra
  0 siblings, 1 reply; 2+ messages in thread
From: Kees Cook @ 2022-12-16 20:30 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Kees Cook, Eric W. Biederman, Jann Horn, Arnd Bergmann,
	Petr Mladek, Andrew Morton, Luis Chamberlain, Marco Elver,
	tangmeng, Sebastian Andrzej Siewior, Tiezhu Yang, Stafford Horne,
	Guilherme G. Piccoli, John Ogness, linux-kernel, linux-hardening

Use a temporary variable to take full advantage of READ_ONCE() behavior.
Without this, the report (and even the test) might be out of sync with
the initial test.

Reported-by: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/lkml/Y5x7GXeluFmZ8E0E@hirez.programming.kicks-ass.net
Fixes: 9fc9e278a5c0 ("panic: Introduce warn_limit")
Fixes: d4ccd54d28d3 ("exit: Put an upper limit on how often we can oops")
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Jann Horn <jannh@google.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Luis Chamberlain <mcgrof@kernel.org>
Cc: Marco Elver <elver@google.com>
Cc: tangmeng <tangmeng@uniontech.com>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 kernel/exit.c  | 6 ++++--
 kernel/panic.c | 7 +++++--
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/kernel/exit.c b/kernel/exit.c
index deffb8e4b1b2..15dc2ec80c46 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -931,6 +931,7 @@ void __noreturn make_task_dead(int signr)
 	 * Then do everything else.
 	 */
 	struct task_struct *tsk = current;
+	unsigned int limit;
 
 	if (unlikely(in_interrupt()))
 		panic("Aiee, killing interrupt handler!");
@@ -954,8 +955,9 @@ void __noreturn make_task_dead(int signr)
 	 * To make sure this can't happen, place an upper bound on how often the
 	 * kernel may oops without panic().
 	 */
-	if (atomic_inc_return(&oops_count) >= READ_ONCE(oops_limit) && oops_limit)
-		panic("Oopsed too often (kernel.oops_limit is %d)", oops_limit);
+	limit = READ_ONCE(oops_limit);
+	if (atomic_inc_return(&oops_count) >= limit && limit)
+		panic("Oopsed too often (kernel.oops_limit is %d)", limit);
 
 	/*
 	 * We're taking recursive faults here in make_task_dead. Safest is to just
diff --git a/kernel/panic.c b/kernel/panic.c
index 54deb743b2d5..7834c9854e02 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -231,12 +231,15 @@ static void panic_print_sys_info(bool console_flush)
 
 void check_panic_on_warn(const char *origin)
 {
+	unsigned int limit;
+
 	if (panic_on_warn)
 		panic("%s: panic_on_warn set ...\n", origin);
 
-	if (atomic_inc_return(&warn_count) >= READ_ONCE(warn_limit) && warn_limit)
+	limit = READ_ONCE(warn_limit);
+	if (atomic_inc_return(&warn_count) >= limit && limit)
 		panic("%s: system warned too often (kernel.warn_limit is %d)",
-		      origin, warn_limit);
+		      origin, limit);
 }
 
 /**
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] exit: Use READ_ONCE() for all oops/warn limit reads
  2022-12-16 20:30 [PATCH] exit: Use READ_ONCE() for all oops/warn limit reads Kees Cook
@ 2022-12-19 11:39 ` Peter Zijlstra
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Zijlstra @ 2022-12-19 11:39 UTC (permalink / raw)
  To: Kees Cook
  Cc: Eric W. Biederman, Jann Horn, Arnd Bergmann, Petr Mladek,
	Andrew Morton, Luis Chamberlain, Marco Elver, tangmeng,
	Sebastian Andrzej Siewior, Tiezhu Yang, Stafford Horne,
	Guilherme G. Piccoli, John Ogness, linux-kernel, linux-hardening

On Fri, Dec 16, 2022 at 12:30:28PM -0800, Kees Cook wrote:
> Use a temporary variable to take full advantage of READ_ONCE() behavior.
> Without this, the report (and even the test) might be out of sync with
> the initial test.
> 
> Reported-by: Peter Zijlstra <peterz@infradead.org>
> Link: https://lore.kernel.org/lkml/Y5x7GXeluFmZ8E0E@hirez.programming.kicks-ass.net
> Fixes: 9fc9e278a5c0 ("panic: Introduce warn_limit")
> Fixes: d4ccd54d28d3 ("exit: Put an upper limit on how often we can oops")

Thanks!

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-12-19 11:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-16 20:30 [PATCH] exit: Use READ_ONCE() for all oops/warn limit reads Kees Cook
2022-12-19 11:39 ` Peter Zijlstra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox