Message ID | 20220125220037.2738923-1-keescook@chromium.org (mailing list archive) |
---|---|
State | Mainlined |
Commit | c6d777acdf8f62d4ebaef0e5c6cd8fedbd6e8546 |
Headers | show |
Series | perf: Avoid -Warray-bounds warning for __rel_loc macro | expand |
On Tue, 25 Jan 2022 14:00:37 -0800 Kees Cook <keescook@chromium.org> wrote: > 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. > This looks good to me. Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org> BTW, same macro is in the include/trace/bpf_probe.h. I'm not sure bpf using this macro, should we update it for consistency? > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Masami Hiramatsu <mhiramat@kernel.org> > Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> > Signed-off-by: Kees Cook <keescook@chromium.org> > --- > include/trace/perf.h | 5 +++-- > include/trace/trace_events.h | 2 +- > 2 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/include/trace/perf.h b/include/trace/perf.h > index b77d09c70a93..5800d13146c3 100644 > --- a/include/trace/perf.h > +++ b/include/trace/perf.h > @@ -26,8 +26,9 @@ > > #undef __get_rel_dynamic_array > #define __get_rel_dynamic_array(field) \ > - ((void *)(&__entry->__rel_loc_##field) + \ > - sizeof(__entry->__rel_loc_##field) + \ > + ((void *)__entry + \ > + offsetof(typeof(*__entry), __rel_loc_##field) + \ > + sizeof(__entry->__rel_loc_##field) + \ > (__entry->__rel_loc_##field & 0xffff)) > > #undef __get_rel_dynamic_array_len > diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h > index cefefed18e85..7c86cc541c7a 100644 > --- a/include/trace/trace_events.h > +++ b/include/trace/trace_events.h > @@ -134,7 +134,7 @@ TRACE_MAKE_SYSTEM_STR(); > struct trace_event_raw_##name { \ > struct trace_entry ent; \ > tstruct \ > - char __data[0]; \ > + char __data[]; \ > }; \ > \ > static struct trace_event_class event_class_##name; > -- > 2.30.2 >
diff --git a/include/trace/perf.h b/include/trace/perf.h index b77d09c70a93..5800d13146c3 100644 --- a/include/trace/perf.h +++ b/include/trace/perf.h @@ -26,8 +26,9 @@ #undef __get_rel_dynamic_array #define __get_rel_dynamic_array(field) \ - ((void *)(&__entry->__rel_loc_##field) + \ - sizeof(__entry->__rel_loc_##field) + \ + ((void *)__entry + \ + offsetof(typeof(*__entry), __rel_loc_##field) + \ + sizeof(__entry->__rel_loc_##field) + \ (__entry->__rel_loc_##field & 0xffff)) #undef __get_rel_dynamic_array_len diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h index cefefed18e85..7c86cc541c7a 100644 --- a/include/trace/trace_events.h +++ b/include/trace/trace_events.h @@ -134,7 +134,7 @@ TRACE_MAKE_SYSTEM_STR(); struct trace_event_raw_##name { \ struct trace_entry ent; \ tstruct \ - char __data[0]; \ + char __data[]; \ }; \ \ static struct trace_event_class event_class_##name;
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. Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Kees Cook <keescook@chromium.org> --- include/trace/perf.h | 5 +++-- include/trace/trace_events.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-)