tracing: Have event format check not flag %p* on __get_dynamic_array()
authorSteven Rostedt (Google) <rostedt@goodmis.org>
Thu, 7 Apr 2022 18:56:32 +0000 (14:56 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 29 Jul 2022 15:25:29 +0000 (17:25 +0200)
[ Upstream commit 499f12168aebd6da8fa32c9b7d6203ca9b5eb88d ]

The print fmt check against trace events to make sure that the format does
not use pointers that may be freed from the time of the trace to the time
the event is read, gives a false positive on %pISpc when reading data that
was saved in __get_dynamic_array() when it is perfectly fine to do so, as
the data being read is on the ring buffer.

Link: https://lore.kernel.org/all/20220407144524.2a592ed6@canb.auug.org.au/
Cc: stable@vger.kernel.org
Fixes: 5013f454a352c ("tracing: Add check of trace event print fmts for dereferencing pointers")
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/trace/trace_events.c

index c072e8b9849c1c2590d0735e1f8683a881f09932..ea3fbfa87fdd06712c6a5984a3bb2d5ba7338b88 100644 (file)
@@ -407,7 +407,14 @@ static void test_event_printk(struct trace_event_call *call)
                                a = strchr(fmt + i, '&');
                                if ((a && (a < r)) || test_field(r, call))
                                        dereference_flags &= ~(1ULL << arg);
+                       } else if ((r = strstr(fmt + i, "__get_dynamic_array(")) &&
+                                  (!c || r < c)) {
+                               dereference_flags &= ~(1ULL << arg);
+                       } else if ((r = strstr(fmt + i, "__get_sockaddr(")) &&
+                                  (!c || r < c)) {
+                               dereference_flags &= ~(1ULL << arg);
                        }
+
                next_arg:
                        i--;
                        arg++;