Skip to content

Commit 8e24206

Browse files
mhiramatrostedt
authored andcommitted
tracing/probes: Reject events which have the same name of existing one
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 <[email protected]> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent 8565a45 commit 8e24206

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

kernel/trace/trace_kprobe.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,11 @@ static int register_trace_kprobe(struct trace_kprobe *tk)
647647
/* Register new event */
648648
ret = register_kprobe_event(tk);
649649
if (ret) {
650-
pr_warn("Failed to register probe event(%d)\n", ret);
650+
if (ret == -EEXIST) {
651+
trace_probe_log_set_index(0);
652+
trace_probe_log_err(0, EVENT_EXIST);
653+
} else
654+
pr_warn("Failed to register probe event(%d)\n", ret);
651655
goto end;
652656
}
653657

kernel/trace/trace_probe.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,11 +1047,36 @@ int trace_probe_init(struct trace_probe *tp, const char *event,
10471047
return ret;
10481048
}
10491049

1050+
static struct trace_event_call *
1051+
find_trace_event_call(const char *system, const char *event_name)
1052+
{
1053+
struct trace_event_call *tp_event;
1054+
const char *name;
1055+
1056+
list_for_each_entry(tp_event, &ftrace_events, list) {
1057+
if (!tp_event->class->system ||
1058+
strcmp(system, tp_event->class->system))
1059+
continue;
1060+
name = trace_event_name(tp_event);
1061+
if (!name || strcmp(event_name, name))
1062+
continue;
1063+
return tp_event;
1064+
}
1065+
1066+
return NULL;
1067+
}
1068+
10501069
int trace_probe_register_event_call(struct trace_probe *tp)
10511070
{
10521071
struct trace_event_call *call = trace_probe_event_call(tp);
10531072
int ret;
10541073

1074+
lockdep_assert_held(&event_mutex);
1075+
1076+
if (find_trace_event_call(trace_probe_group_name(tp),
1077+
trace_probe_name(tp)))
1078+
return -EEXIST;
1079+
10551080
ret = register_trace_event(&call->event);
10561081
if (!ret)
10571082
return -ENODEV;

kernel/trace/trace_probe.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call,
404404
C(NO_EVENT_NAME, "Event name is not specified"), \
405405
C(EVENT_TOO_LONG, "Event name is too long"), \
406406
C(BAD_EVENT_NAME, "Event name must follow the same rules as C identifiers"), \
407+
C(EVENT_EXIST, "Given group/event name is already used by another event"), \
407408
C(RETVAL_ON_PROBE, "$retval is not available on probe"), \
408409
C(BAD_STACK_NUM, "Invalid stack number"), \
409410
C(BAD_ARG_NUM, "Invalid argument number"), \

kernel/trace/trace_uprobe.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,11 @@ static int register_trace_uprobe(struct trace_uprobe *tu)
515515

516516
ret = register_uprobe_event(tu);
517517
if (ret) {
518-
pr_warn("Failed to register probe event(%d)\n", ret);
518+
if (ret == -EEXIST) {
519+
trace_probe_log_set_index(0);
520+
trace_probe_log_err(0, EVENT_EXIST);
521+
} else
522+
pr_warn("Failed to register probe event(%d)\n", ret);
519523
goto end;
520524
}
521525

0 commit comments

Comments
 (0)