lkml.org 
[lkml]   [2015]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH perf/core 2/2] perf-probe: Check the orphaned -x option
    From
    Date
    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>
    Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    ---
    tools/perf/builtin-probe.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
    index 2df23e1..f7b1af6 100644
    --- a/tools/perf/builtin-probe.c
    +++ b/tools/perf/builtin-probe.c
    @@ -56,6 +56,7 @@ static struct {
    bool mod_events;
    bool uprobes;
    bool quiet;
    + bool target_used;
    int nevents;
    struct perf_probe_event events[MAX_PROBES];
    struct strlist *dellist;
    @@ -82,6 +83,7 @@ static int parse_probe_event(const char *str)
    pev->target = strdup(params.target);
    if (!pev->target)
    return -ENOMEM;
    + params.target_used = true;
    }

    /* Parse a perf-probe command into event */
    @@ -107,6 +109,7 @@ static int set_target(const char *ptr)
    params.target = strdup(ptr);
    if (!params.target)
    return -ENOMEM;
    + params.target_used = false;

    found = 1;
    buf = ptr + (strlen(ptr) - 3);
    @@ -207,6 +210,7 @@ static int opt_set_target(const struct option *opt, const char *str,
    }
    free(params.target);
    params.target = tmp;
    + params.target_used = false;
    ret = 0;
    }

    @@ -491,6 +495,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
    }

    if (params.nevents) {
    + /* Ensure the last given target is used */
    + if (params.target && !params.target_used) {
    + pr_warning(" Error: -x/-m must follow the probe definitions.\n");
    + usage_with_options(probe_usage, options);
    + }
    +
    ret = add_perf_probe_events(params.events, params.nevents,
    params.max_probe_points,
    params.force_add);


    \
     
     \ /
      Last update: 2015-04-01 13:01    [W:6.189 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site