]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tracing: Do not reference event data in post call triggers
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Mon, 7 May 2018 20:02:14 +0000 (16:02 -0400)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Tue, 29 May 2018 12:28:02 +0000 (08:28 -0400)
Trace event triggers can be called before or after the event has been
committed. If it has been called after the commit, there's a possibility
that the event no longer exists. Currently, the two post callers is the
trigger to disable tracing (traceoff) and the one that will record a stack
dump (stacktrace). Neither of them reference the trace event entry record,
as that would lead to a race condition that could pass in corrupted data.

To prevent any other users of the post data triggers from using the trace
event record, pass in NULL to the post call trigger functions for the event
record, as they should never need to use them in the first place.

This does not fix any bug, but prevents bugs from happening by new post call
trigger users.

Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
include/linux/trace_events.h
kernel/trace/trace.h
kernel/trace/trace_events_trigger.c

index 2bde3eff564cdde138c8d22da4d4d8d125e2ed3d..d1c442d9bd8530211840dfc524641e2550b503b4 100644 (file)
@@ -435,8 +435,7 @@ event_triggers_call(struct trace_event_file *file, void *rec,
                    struct ring_buffer_event *event);
 extern void
 event_triggers_post_call(struct trace_event_file *file,
-                        enum event_trigger_type tt,
-                        void *rec, struct ring_buffer_event *event);
+                        enum event_trigger_type tt);
 
 bool trace_event_ignore_this_pid(struct trace_event_file *trace_file);
 
index 507954b4e058f0bd8294760e5dcb7efa78c61211..6bfc2467479cd9a97e0b5a5f5a6303333e170fb3 100644 (file)
@@ -1334,7 +1334,7 @@ event_trigger_unlock_commit(struct trace_event_file *file,
                trace_buffer_unlock_commit(file->tr, buffer, event, irq_flags, pc);
 
        if (tt)
-               event_triggers_post_call(file, tt, entry, event);
+               event_triggers_post_call(file, tt);
 }
 
 /**
@@ -1367,7 +1367,7 @@ event_trigger_unlock_commit_regs(struct trace_event_file *file,
                                                irq_flags, pc, regs);
 
        if (tt)
-               event_triggers_post_call(file, tt, entry, event);
+               event_triggers_post_call(file, tt);
 }
 
 #define FILTER_PRED_INVALID    ((unsigned short)-1)
index 8b5bdcf64871a31d90cb412b2755f4f33f565ec0..d18249683682f750a1b86387355e9b159bb1b3d5 100644 (file)
@@ -97,7 +97,6 @@ EXPORT_SYMBOL_GPL(event_triggers_call);
  * event_triggers_post_call - Call 'post_triggers' for a trace event
  * @file: The trace_event_file associated with the event
  * @tt: enum event_trigger_type containing a set bit for each trigger to invoke
- * @rec: The trace entry for the event
  *
  * For each trigger associated with an event, invoke the trigger
  * function registered with the associated trigger command, if the
@@ -108,8 +107,7 @@ EXPORT_SYMBOL_GPL(event_triggers_call);
  */
 void
 event_triggers_post_call(struct trace_event_file *file,
-                        enum event_trigger_type tt,
-                        void *rec, struct ring_buffer_event *event)
+                        enum event_trigger_type tt)
 {
        struct event_trigger_data *data;
 
@@ -117,7 +115,7 @@ event_triggers_post_call(struct trace_event_file *file,
                if (data->paused)
                        continue;
                if (data->cmd_ops->trigger_type & tt)
-                       data->ops->func(data, rec, event);
+                       data->ops->func(data, NULL, NULL);
        }
 }
 EXPORT_SYMBOL_GPL(event_triggers_post_call);