Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf probe: Check the orphaned -x option

To avoid probing in unintended binary, the orphaned -x option must be
checked and warned.

Without this patch, following command sets up the probe in the kernel.

-----
# perf probe -a strcpy -x ./perf
Added new event:
probe:strcpy (on strcpy)

You can now use it in all perf tools, such as:

perf record -e probe:strcpy -aR sleep 1
-----

But in this case, it seems that the user may want to probe in the perf
binary. With this patch, perf-probe correctly handles the orphaned -x.

-----
# perf probe -a strcpy -x ./perf
Error: -x/-m must follow the probe definitions.
...
-----

Reported-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20150401102541.17137.75477.stgit@localhost.localdomain
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Masami Hiramatsu and committed by
Arnaldo Carvalho de Melo
8cb0aa4c 7afb3fab

+10
+10
tools/perf/builtin-probe.c
··· 56 56 bool mod_events; 57 57 bool uprobes; 58 58 bool quiet; 59 + bool target_used; 59 60 int nevents; 60 61 struct perf_probe_event events[MAX_PROBES]; 61 62 struct strlist *dellist; ··· 83 82 pev->target = strdup(params.target); 84 83 if (!pev->target) 85 84 return -ENOMEM; 85 + params.target_used = true; 86 86 } 87 87 88 88 /* Parse a perf-probe command into event */ ··· 109 107 params.target = strdup(ptr); 110 108 if (!params.target) 111 109 return -ENOMEM; 110 + params.target_used = false; 112 111 113 112 found = 1; 114 113 buf = ptr + (strlen(ptr) - 3); ··· 210 207 } 211 208 free(params.target); 212 209 params.target = tmp; 210 + params.target_used = false; 213 211 ret = 0; 214 212 } 215 213 ··· 495 491 } 496 492 497 493 if (params.nevents) { 494 + /* Ensure the last given target is used */ 495 + if (params.target && !params.target_used) { 496 + pr_warning(" Error: -x/-m must follow the probe definitions.\n"); 497 + usage_with_options(probe_usage, options); 498 + } 499 + 498 500 ret = add_perf_probe_events(params.events, params.nevents, 499 501 params.max_probe_points, 500 502 params.force_add);