Miroslav Benes 15d2ff
From: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>
Miroslav Benes 15d2ff
Date: Thu, 23 Dec 2021 16:04:38 +0530
Miroslav Benes 15d2ff
Subject: tracing: Fix check for trace_percpu_buffer validity in
Miroslav Benes 15d2ff
 get_trace_buf()
Miroslav Benes 15d2ff
Git-commit: 823e670f7ed616d0ce993075c8afe0217885f79d
Miroslav Benes 15d2ff
Patch-mainline: v5.16
Miroslav Benes 15d2ff
References: git-fixes
Miroslav Benes 15d2ff
Miroslav Benes 15d2ff
With the new osnoise tracer, we are seeing the below splat:
Miroslav Benes 15d2ff
    Kernel attempted to read user page (c7d880000) - exploit attempt? (uid: 0)
Miroslav Benes 15d2ff
    BUG: Unable to handle kernel data access on read at 0xc7d880000
Miroslav Benes 15d2ff
    Faulting instruction address: 0xc0000000002ffa10
Miroslav Benes 15d2ff
    Oops: Kernel access of bad area, sig: 11 [#1]
Miroslav Benes 15d2ff
    LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries
Miroslav Benes 15d2ff
    ...
Miroslav Benes 15d2ff
    NIP [c0000000002ffa10] __trace_array_vprintk.part.0+0x70/0x2f0
Miroslav Benes 15d2ff
    LR [c0000000002ff9fc] __trace_array_vprintk.part.0+0x5c/0x2f0
Miroslav Benes 15d2ff
    Call Trace:
Miroslav Benes 15d2ff
    [c0000008bdd73b80] [c0000000001c49cc] put_prev_task_fair+0x3c/0x60 (unreliable)
Miroslav Benes 15d2ff
    [c0000008bdd73be0] [c000000000301430] trace_array_printk_buf+0x70/0x90
Miroslav Benes 15d2ff
    [c0000008bdd73c00] [c0000000003178b0] trace_sched_switch_callback+0x250/0x290
Miroslav Benes 15d2ff
    [c0000008bdd73c90] [c000000000e70d60] __schedule+0x410/0x710
Miroslav Benes 15d2ff
    [c0000008bdd73d40] [c000000000e710c0] schedule+0x60/0x130
Miroslav Benes 15d2ff
    [c0000008bdd73d70] [c000000000030614] interrupt_exit_user_prepare_main+0x264/0x270
Miroslav Benes 15d2ff
    [c0000008bdd73de0] [c000000000030a70] syscall_exit_prepare+0x150/0x180
Miroslav Benes 15d2ff
    [c0000008bdd73e10] [c00000000000c174] system_call_vectored_common+0xf4/0x278
Miroslav Benes 15d2ff
Miroslav Benes 15d2ff
osnoise tracer on ppc64le is triggering osnoise_taint() for negative
Miroslav Benes 15d2ff
duration in get_int_safe_duration() called from
Miroslav Benes 15d2ff
trace_sched_switch_callback()->thread_exit().
Miroslav Benes 15d2ff
Miroslav Benes 15d2ff
The problem though is that the check for a valid trace_percpu_buffer is
Miroslav Benes 15d2ff
incorrect in get_trace_buf(). The check is being done after calculating
Miroslav Benes 15d2ff
the pointer for the current cpu, rather than on the main percpu pointer.
Miroslav Benes 15d2ff
Fix the check to be against trace_percpu_buffer.
Miroslav Benes 15d2ff
Miroslav Benes 15d2ff
Link: https://lkml.kernel.org/r/a920e4272e0b0635cf20c444707cbce1b2c8973d.1640255304.git.naveen.n.rao@linux.vnet.ibm.com
Miroslav Benes 15d2ff
Miroslav Benes 15d2ff
Cc: stable@vger.kernel.org
Miroslav Benes 15d2ff
Fixes: e2ace001176dc9 ("tracing: Choose static tp_printk buffer by explicit nesting count")
Miroslav Benes 15d2ff
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Miroslav Benes 15d2ff
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Miroslav Benes 15d2ff
Acked-by: Miroslav Benes <mbenes@suse.cz>
Miroslav Benes 15d2ff
---
Miroslav Benes 15d2ff
 kernel/trace/trace.c | 2 +-
Miroslav Benes 15d2ff
 1 file changed, 1 insertion(+), 1 deletion(-)
Miroslav Benes 15d2ff
Miroslav Benes 15d2ff
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
Miroslav Benes 15d2ff
index 88de94da596b..e1f55851e53f 100644
Miroslav Benes 15d2ff
--- a/kernel/trace/trace.c
Miroslav Benes 15d2ff
+++ b/kernel/trace/trace.c
Miroslav Benes 15d2ff
@@ -3217,7 +3217,7 @@ static char *get_trace_buf(void)
Miroslav Benes 15d2ff
 {
Miroslav Benes 15d2ff
 	struct trace_buffer_struct *buffer = this_cpu_ptr(trace_percpu_buffer);
Miroslav Benes 15d2ff
 
Miroslav Benes 15d2ff
-	if (!buffer || buffer->nesting >= 4)
Miroslav Benes 15d2ff
+	if (!trace_percpu_buffer || buffer->nesting >= 4)
Miroslav Benes 15d2ff
 		return NULL;
Miroslav Benes 15d2ff
 
Miroslav Benes 15d2ff
 	buffer->nesting++;
Miroslav Benes 15d2ff