Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing/perf: Avoid -Warray-bounds warning for __rel_loc macro

As done for trace_events.h, also fix the __rel_loc macro in perf.h,
which silences the -Warray-bounds warning:

In file included from ./include/linux/string.h:253,
from ./include/linux/bitmap.h:11,
from ./include/linux/cpumask.h:12,
from ./include/linux/mm_types_task.h:14,
from ./include/linux/mm_types.h:5,
from ./include/linux/buildid.h:5,
from ./include/linux/module.h:14,
from samples/trace_events/trace-events-sample.c:2:
In function '__fortify_strcpy',
inlined from 'perf_trace_foo_rel_loc' at samples/trace_events/./trace-events-sample.h:519:1:
./include/linux/fortify-string.h:47:33: warning: '__builtin_strcpy' offset 12 is out of the bounds [
0, 4] [-Warray-bounds]
47 | #define __underlying_strcpy __builtin_strcpy
| ^
./include/linux/fortify-string.h:445:24: note: in expansion of macro '__underlying_strcpy'
445 | return __underlying_strcpy(p, q);
| ^~~~~~~~~~~~~~~~~~~

Also make __data struct member a proper flexible array to avoid future
problems.

Link: https://lkml.kernel.org/r/20220125220037.2738923-1-keescook@chromium.org

Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Fixes: 55de2c0b5610c ("tracing: Add '__rel_loc' using trace event macros")
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

authored by

Kees Cook and committed by
Steven Rostedt (Google)
c6d777ac 58c5724e

+4 -3
+3 -2
include/trace/perf.h
··· 23 23 24 24 #undef __get_rel_dynamic_array 25 25 #define __get_rel_dynamic_array(field) \ 26 - ((void *)(&__entry->__rel_loc_##field) + \ 27 - sizeof(__entry->__rel_loc_##field) + \ 26 + ((void *)__entry + \ 27 + offsetof(typeof(*__entry), __rel_loc_##field) + \ 28 + sizeof(__entry->__rel_loc_##field) + \ 28 29 (__entry->__rel_loc_##field & 0xffff)) 29 30 30 31 #undef __get_rel_dynamic_array_len
+1 -1
include/trace/trace_events.h
··· 128 128 struct trace_event_raw_##name { \ 129 129 struct trace_entry ent; \ 130 130 tstruct \ 131 - char __data[0]; \ 131 + char __data[]; \ 132 132 }; \ 133 133 \ 134 134 static struct trace_event_class event_class_##name;