]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 Jun 2019 15:32:51 +0000 (17:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 Jun 2019 15:32:51 +0000 (17:32 +0200)
added patches:
tracing-silence-gcc-9-array-bounds-warning.patch

queue-4.9/series
queue-4.9/tracing-silence-gcc-9-array-bounds-warning.patch [new file with mode: 0644]

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..09c82e5958eabf2cf8684309fe7d9ed8502bf7d6 100644 (file)
@@ -0,0 +1 @@
+tracing-silence-gcc-9-array-bounds-warning.patch
diff --git a/queue-4.9/tracing-silence-gcc-9-array-bounds-warning.patch b/queue-4.9/tracing-silence-gcc-9-array-bounds-warning.patch
new file mode 100644 (file)
index 0000000..68979ed
--- /dev/null
@@ -0,0 +1,103 @@
+From 0c97bf863efce63d6ab7971dad811601e6171d2f Mon Sep 17 00:00:00 2001
+From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
+Date: Thu, 23 May 2019 14:45:35 +0200
+Subject: tracing: Silence GCC 9 array bounds warning
+
+From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
+
+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 <miguel.ojeda.sandonis@gmail.com>
+[ Removed unnecessary parenthesis around "iter" ]
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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
+@@ -7613,12 +7613,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
+@@ -1673,4 +1673,22 @@ static inline void trace_event_enum_upda
+ 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
+@@ -40,12 +40,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) {