]> git.baikalelectronics.ru Git - kernel.git/commitdiff
tracing/probes: Reject events which have the same name of existing one
authorMasami Hiramatsu <mhiramat@kernel.org>
Thu, 19 Aug 2021 10:26:02 +0000 (19:26 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Thu, 19 Aug 2021 13:15:19 +0000 (09:15 -0400)
Since kprobe_events and uprobe_events only check whether the
other same-type probe event has the same name or not, if the
user gives the same name of the existing tracepoint event (or
the other type of probe events), it silently fails to create
the tracefs entry (but registered.) as below.

/sys/kernel/tracing # ls events/task/task_rename
enable   filter   format   hist     id       trigger
/sys/kernel/tracing # echo p:task/task_rename vfs_read >> kprobe_events
[  113.048508] Could not create tracefs 'task_rename' directory
/sys/kernel/tracing # cat kprobe_events
p:task/task_rename vfs_read

To fix this issue, check whether the existing events have the
same name or not in trace_probe_register_event_call(). If exists,
it rejects to register the new event.

Link: https://lkml.kernel.org/r/162936876189.187130.17558311387542061930.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/trace/trace_kprobe.c
kernel/trace/trace_probe.c
kernel/trace/trace_probe.h
kernel/trace/trace_uprobe.c

index 4b013d24f5a918374e75b54ddb463bbfed82c2d2..882c270440290777c22bb7127e13ee9d3c40e2b8 100644 (file)
@@ -647,7 +647,11 @@ static int register_trace_kprobe(struct trace_kprobe *tk)
        /* Register new event */
        ret = register_kprobe_event(tk);
        if (ret) {
-               pr_warn("Failed to register probe event(%d)\n", ret);
+               if (ret == -EEXIST) {
+                       trace_probe_log_set_index(0);
+                       trace_probe_log_err(0, EVENT_EXIST);
+               } else
+                       pr_warn("Failed to register probe event(%d)\n", ret);
                goto end;
        }
 
index 9c9c83a063b25fc66607c3c93b0f1564e26fb76a..782c00eb6859d8c09c2113a7b4585b2d2be0ee82 100644 (file)
@@ -1047,11 +1047,36 @@ error:
        return ret;
 }
 
+static struct trace_event_call *
+find_trace_event_call(const char *system, const char *event_name)
+{
+       struct trace_event_call *tp_event;
+       const char *name;
+
+       list_for_each_entry(tp_event, &ftrace_events, list) {
+               if (!tp_event->class->system ||
+                   strcmp(system, tp_event->class->system))
+                       continue;
+               name = trace_event_name(tp_event);
+               if (!name || strcmp(event_name, name))
+                       continue;
+               return tp_event;
+       }
+
+       return NULL;
+}
+
 int trace_probe_register_event_call(struct trace_probe *tp)
 {
        struct trace_event_call *call = trace_probe_event_call(tp);
        int ret;
 
+       lockdep_assert_held(&event_mutex);
+
+       if (find_trace_event_call(trace_probe_group_name(tp),
+                                 trace_probe_name(tp)))
+               return -EEXIST;
+
        ret = register_trace_event(&call->event);
        if (!ret)
                return -ENODEV;
index 8adf5f3542a6982f088fb04dda049e8a4a85e78b..66701a92d18664ee19c8bf157a49781d69e7e25e 100644 (file)
@@ -404,6 +404,7 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call,
        C(NO_EVENT_NAME,        "Event name is not specified"),         \
        C(EVENT_TOO_LONG,       "Event name is too long"),              \
        C(BAD_EVENT_NAME,       "Event name must follow the same rules as C identifiers"), \
+       C(EVENT_EXIST,          "Given group/event name is already used by another event"), \
        C(RETVAL_ON_PROBE,      "$retval is not available on probe"),   \
        C(BAD_STACK_NUM,        "Invalid stack number"),                \
        C(BAD_ARG_NUM,          "Invalid argument number"),             \
index d219ba50efbd4d5ff4814722fdb42f604d55aa92..225ce569bf8f892a305cc4b2e27b6702c17b639e 100644 (file)
@@ -515,7 +515,11 @@ static int register_trace_uprobe(struct trace_uprobe *tu)
 
        ret = register_uprobe_event(tu);
        if (ret) {
-               pr_warn("Failed to register probe event(%d)\n", ret);
+               if (ret == -EEXIST) {
+                       trace_probe_log_set_index(0);
+                       trace_probe_log_err(0, EVENT_EXIST);
+               } else
+                       pr_warn("Failed to register probe event(%d)\n", ret);
                goto end;
        }