From 33747e7da76b8233583ffb85b6a85d26ac948cee Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 22 Jun 2019 17:29:52 +0200 Subject: [PATCH] 5.1-stable patches added patches: tracing-silence-gcc-9-array-bounds-warning.patch --- queue-5.1/series | 1 + ...g-silence-gcc-9-array-bounds-warning.patch | 103 ++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 queue-5.1/series create mode 100644 queue-5.1/tracing-silence-gcc-9-array-bounds-warning.patch diff --git a/queue-5.1/series b/queue-5.1/series new file mode 100644 index 00000000000..09c82e5958e --- /dev/null +++ b/queue-5.1/series @@ -0,0 +1 @@ +tracing-silence-gcc-9-array-bounds-warning.patch diff --git a/queue-5.1/tracing-silence-gcc-9-array-bounds-warning.patch b/queue-5.1/tracing-silence-gcc-9-array-bounds-warning.patch new file mode 100644 index 00000000000..b25d384f279 --- /dev/null +++ b/queue-5.1/tracing-silence-gcc-9-array-bounds-warning.patch @@ -0,0 +1,103 @@ +From 0c97bf863efce63d6ab7971dad811601e6171d2f Mon Sep 17 00:00:00 2001 +From: Miguel Ojeda +Date: Thu, 23 May 2019 14:45:35 +0200 +Subject: tracing: Silence GCC 9 array bounds warning + +From: Miguel Ojeda + +commit 0c97bf863efce63d6ab7971dad811601e6171d2f upstream. + +Starting with GCC 9, -Warray-bounds detects cases when memset is called +starting on a member of a struct but the size to be cleared ends up +writing over further members. + +Such a call happens in the trace code to clear, at once, all members +after and including `seq` on struct trace_iterator: + + In function 'memset', + inlined from 'ftrace_dump' at kernel/trace/trace.c:8914:3: + ./include/linux/string.h:344:9: warning: '__builtin_memset' offset + [8505, 8560] from the object at 'iter' is out of the bounds of + referenced subobject 'seq' with type 'struct trace_seq' at offset + 4368 [-Warray-bounds] + 344 | return __builtin_memset(p, c, size); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In order to avoid GCC complaining about it, we compute the address +ourselves by adding the offsetof distance instead of referring +directly to the member. + +Since there are two places doing this clear (trace.c and trace_kdb.c), +take the chance to move the workaround into a single place in +the internal header. + +Link: http://lkml.kernel.org/r/20190523124535.GA12931@gmail.com + +Signed-off-by: Miguel Ojeda +[ Removed unnecessary parenthesis around "iter" ] +Signed-off-by: Steven Rostedt (VMware) +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/trace/trace.c | 6 +----- + kernel/trace/trace.h | 18 ++++++++++++++++++ + kernel/trace/trace_kdb.c | 6 +----- + 3 files changed, 20 insertions(+), 10 deletions(-) + +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -8627,12 +8627,8 @@ void ftrace_dump(enum ftrace_dump_mode o + + cnt++; + +- /* reset all but tr, trace, and overruns */ +- memset(&iter.seq, 0, +- sizeof(struct trace_iterator) - +- offsetof(struct trace_iterator, seq)); ++ trace_iterator_reset(&iter); + iter.iter_flags |= TRACE_FILE_LAT_FMT; +- iter.pos = -1; + + if (trace_find_next_entry_inc(&iter) != NULL) { + int ret; +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -1964,4 +1964,22 @@ static inline void tracer_hardirqs_off(u + + extern struct trace_iterator *tracepoint_print_iter; + ++/* ++ * Reset the state of the trace_iterator so that it can read consumed data. ++ * Normally, the trace_iterator is used for reading the data when it is not ++ * consumed, and must retain state. ++ */ ++static __always_inline void trace_iterator_reset(struct trace_iterator *iter) ++{ ++ const size_t offset = offsetof(struct trace_iterator, seq); ++ ++ /* ++ * Keep gcc from complaining about overwriting more than just one ++ * member in the structure. ++ */ ++ memset((char *)iter + offset, 0, sizeof(struct trace_iterator) - offset); ++ ++ iter->pos = -1; ++} ++ + #endif /* _LINUX_KERNEL_TRACE_H */ +--- a/kernel/trace/trace_kdb.c ++++ b/kernel/trace/trace_kdb.c +@@ -41,12 +41,8 @@ static void ftrace_dump_buf(int skip_lin + + kdb_printf("Dumping ftrace buffer:\n"); + +- /* reset all but tr, trace, and overruns */ +- memset(&iter.seq, 0, +- sizeof(struct trace_iterator) - +- offsetof(struct trace_iterator, seq)); ++ trace_iterator_reset(&iter); + iter.iter_flags |= TRACE_FILE_LAT_FMT; +- iter.pos = -1; + + if (cpu_file == RING_BUFFER_ALL_CPUS) { + for_each_tracing_cpu(cpu) { -- 2.47.2