lkml.org 
[lkml]   [2012]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/urgent] perf probe: Ensure offset provided is not greater than function length
    Commit-ID:  26b7952494772f0e695271fbd6cf83a852f60f25
    Gitweb: http://git.kernel.org/tip/26b7952494772f0e695271fbd6cf83a852f60f25
    Author: Prashanth Nageshappa <prashanth@linux.vnet.ibm.com>
    AuthorDate: Fri, 24 Feb 2012 13:11:39 +0530
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Wed, 29 Feb 2012 18:29:45 -0300

    perf probe: Ensure offset provided is not greater than function length

    The perf probe command allows kprobe to be inserted at any offset from a
    function start, which results in adding kprobes to unintended location.

    Example: perf probe do_fork+10000 is allowed even though size of do_fork
    is ~904.

    This patch will ensure probe addition fails when the offset specified is
    greater than size of the function.

    Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Jason Baron <jbaron@redhat.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Link: http://lkml.kernel.org/r/4F473F33.4060409@linux.vnet.ibm.com
    Signed-off-by: Prashanth Nageshappa <prashanth@linux.vnet.ibm.com>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/probe-finder.c | 12 +++++++++++-
    1 files changed, 11 insertions(+), 1 deletions(-)

    diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
    index 5d73262..74bd2e6 100644
    --- a/tools/perf/util/probe-finder.c
    +++ b/tools/perf/util/probe-finder.c
    @@ -672,7 +672,7 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
    static int convert_to_trace_point(Dwarf_Die *sp_die, Dwarf_Addr paddr,
    bool retprobe, struct probe_trace_point *tp)
    {
    - Dwarf_Addr eaddr;
    + Dwarf_Addr eaddr, highaddr;
    const char *name;

    /* Copy the name of probe point */
    @@ -683,6 +683,16 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwarf_Addr paddr,
    dwarf_diename(sp_die));
    return -ENOENT;
    }
    + if (dwarf_highpc(sp_die, &highaddr) != 0) {
    + pr_warning("Failed to get end address of %s\n",
    + dwarf_diename(sp_die));
    + return -ENOENT;
    + }
    + if (paddr > highaddr) {
    + pr_warning("Offset specified is greater than size of %s\n",
    + dwarf_diename(sp_die));
    + return -EINVAL;
    + }
    tp->symbol = strdup(name);
    if (tp->symbol == NULL)
    return -ENOMEM;

    \
     
     \ /
      Last update: 2012-03-02 10:55    [W:0.027 / U:30.188 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site