]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rv: Use strings in da monitors tracepoints
authorGabriele Monaco <gmonaco@redhat.com>
Mon, 28 Jul 2025 13:50:15 +0000 (15:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Aug 2025 14:38:56 +0000 (16:38 +0200)
[ Upstream commit 7f904ff6e58d398c4336f3c19c42b338324451f7 ]

Using DA monitors tracepoints with KASAN enabled triggers the following
warning:

 BUG: KASAN: global-out-of-bounds in do_trace_event_raw_event_event_da_monitor+0xd6/0x1a0
 Read of size 32 at addr ffffffffaada8980 by task ...
 Call Trace:
  <TASK>
 [...]
  do_trace_event_raw_event_event_da_monitor+0xd6/0x1a0
  ? __pfx_do_trace_event_raw_event_event_da_monitor+0x10/0x10
  ? trace_event_sncid+0x83/0x200
  trace_event_sncid+0x163/0x200
 [...]
 The buggy address belongs to the variable:
  automaton_snep+0x4e0/0x5e0

This is caused by the tracepoints reading 32 bytes __array instead of
__string from the automata definition. Such strings are literals and
reading 32 bytes ends up in out of bound memory accesses (e.g. the next
automaton's data in this case).
The error is harmless as, while printing the string, we stop at the null
terminator, but it should still be fixed.

Use the __string facilities while defining the tracepoints to avoid
reading out of bound memory.

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tomas Glozar <tglozar@redhat.com>
Cc: Juri Lelli <jlelli@redhat.com>
Cc: Clark Williams <williams@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
Link: https://lore.kernel.org/20250728135022.255578-4-gmonaco@redhat.com
Fixes: 792575348ff7 ("rv/include: Add deterministic automata monitor definition via C macros")
Reviewed-by: Nam Cao <namcao@linutronix.de>
Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/trace/rv/rv_trace.h

index 18fa0e358a30e42200f2d6dc9bb3293dcb0af625..01fa84824bcbe6dee7c31d483b7031dc78d88a4a 100644 (file)
@@ -16,23 +16,23 @@ DECLARE_EVENT_CLASS(event_da_monitor,
        TP_ARGS(state, event, next_state, final_state),
 
        TP_STRUCT__entry(
-               __array(        char,   state,          MAX_DA_NAME_LEN )
-               __array(        char,   event,          MAX_DA_NAME_LEN )
-               __array(        char,   next_state,     MAX_DA_NAME_LEN )
-               __field(        bool,   final_state                     )
+               __string(       state,          state           )
+               __string(       event,          event           )
+               __string(       next_state,     next_state      )
+               __field(        bool,           final_state     )
        ),
 
        TP_fast_assign(
-               memcpy(__entry->state,          state,          MAX_DA_NAME_LEN);
-               memcpy(__entry->event,          event,          MAX_DA_NAME_LEN);
-               memcpy(__entry->next_state,     next_state,     MAX_DA_NAME_LEN);
-               __entry->final_state            = final_state;
+               __assign_str(state);
+               __assign_str(event);
+               __assign_str(next_state);
+               __entry->final_state = final_state;
        ),
 
        TP_printk("%s x %s -> %s%s",
-               __entry->state,
-               __entry->event,
-               __entry->next_state,
+               __get_str(state),
+               __get_str(event),
+               __get_str(next_state),
                __entry->final_state ? " (final)" : "")
 );
 
@@ -43,18 +43,18 @@ DECLARE_EVENT_CLASS(error_da_monitor,
        TP_ARGS(state, event),
 
        TP_STRUCT__entry(
-               __array(        char,   state,          MAX_DA_NAME_LEN )
-               __array(        char,   event,          MAX_DA_NAME_LEN )
+               __string(       state,  state   )
+               __string(       event,  event   )
        ),
 
        TP_fast_assign(
-               memcpy(__entry->state,          state,          MAX_DA_NAME_LEN);
-               memcpy(__entry->event,          event,          MAX_DA_NAME_LEN);
+               __assign_str(state);
+               __assign_str(event);
        ),
 
        TP_printk("event %s not expected in the state %s",
-               __entry->event,
-               __entry->state)
+               __get_str(event),
+               __get_str(state))
 );
 
 #include <monitors/wip/wip_trace.h>
@@ -75,26 +75,26 @@ DECLARE_EVENT_CLASS(event_da_monitor_id,
        TP_ARGS(id, state, event, next_state, final_state),
 
        TP_STRUCT__entry(
-               __field(        int,    id                              )
-               __array(        char,   state,          MAX_DA_NAME_LEN )
-               __array(        char,   event,          MAX_DA_NAME_LEN )
-               __array(        char,   next_state,     MAX_DA_NAME_LEN )
-               __field(        bool,   final_state                     )
+               __field(        int,            id              )
+               __string(       state,          state           )
+               __string(       event,          event           )
+               __string(       next_state,     next_state      )
+               __field(        bool,           final_state     )
        ),
 
        TP_fast_assign(
-               memcpy(__entry->state,          state,          MAX_DA_NAME_LEN);
-               memcpy(__entry->event,          event,          MAX_DA_NAME_LEN);
-               memcpy(__entry->next_state,     next_state,     MAX_DA_NAME_LEN);
-               __entry->id                     = id;
-               __entry->final_state            = final_state;
+               __assign_str(state);
+               __assign_str(event);
+               __assign_str(next_state);
+               __entry->id             = id;
+               __entry->final_state    = final_state;
        ),
 
        TP_printk("%d: %s x %s -> %s%s",
                __entry->id,
-               __entry->state,
-               __entry->event,
-               __entry->next_state,
+               __get_str(state),
+               __get_str(event),
+               __get_str(next_state),
                __entry->final_state ? " (final)" : "")
 );
 
@@ -105,21 +105,21 @@ DECLARE_EVENT_CLASS(error_da_monitor_id,
        TP_ARGS(id, state, event),
 
        TP_STRUCT__entry(
-               __field(        int,    id                              )
-               __array(        char,   state,          MAX_DA_NAME_LEN )
-               __array(        char,   event,          MAX_DA_NAME_LEN )
+               __field(        int,    id      )
+               __string(       state,  state   )
+               __string(       event,  event   )
        ),
 
        TP_fast_assign(
-               memcpy(__entry->state,          state,          MAX_DA_NAME_LEN);
-               memcpy(__entry->event,          event,          MAX_DA_NAME_LEN);
-               __entry->id                     = id;
+               __assign_str(state);
+               __assign_str(event);
+               __entry->id     = id;
        ),
 
        TP_printk("%d: event %s not expected in the state %s",
                __entry->id,
-               __entry->event,
-               __entry->state)
+               __get_str(event),
+               __get_str(state))
 );
 
 #include <monitors/wwnr/wwnr_trace.h>