lkml.org 
[lkml]   [2015]   [Aug]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 15/16] perf probe: Prevent segfault when reading probe point with absolute address
    Date
    From: Wang Nan <wangnan0@huawei.com>

    'perf probe -l' panic if there is a manually inserted probing point with
    absolute address. For example:

    # echo 'p:probe/abs_ffffffff811e6615 0xffffffff811e6615' > /sys/kernel/debug/tracing/kprobe_events
    # perf probe -l
    Segmentation fault (core dumped)

    This patch fix this problem by considering the situation that
    "tp->symbol == NULL" in find_perf_probe_point_from_dwarf() and
    find_perf_probe_point_from_map().

    After this patch:

    # perf probe -l
    probe:abs_ffffffff811e6615 (on SyS_write+5@fs/read_write.c)

    And when debug info is missing:

    # rm -rf ~/.debug
    # mv /lib/modules/4.2.0-rc1+/build/vmlinux /lib/modules/4.2.0-rc1+/build/vmlinux.bak
    # perf probe -l
    probe:abs_ffffffff811e6615 (on sys_write+5)

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1440509256-193590-1-git-send-email-wangnan0@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/probe-event.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
    index f07374bc9c5a..6c7e538c9b8b 100644
    --- a/tools/perf/util/probe-event.c
    +++ b/tools/perf/util/probe-event.c
    @@ -515,7 +515,7 @@ static int find_perf_probe_point_from_dwarf(struct probe_trace_point *tp,
    if (ret < 0)
    goto error;
    addr += stext;
    - } else {
    + } else if (tp->symbol) {
    addr = kernel_get_symbol_address_by_name(tp->symbol, false);
    if (addr == 0)
    goto error;
    @@ -1815,17 +1815,17 @@ static int find_perf_probe_point_from_map(struct probe_trace_point *tp,
    {
    struct symbol *sym = NULL;
    struct map *map;
    - u64 addr;
    + u64 addr = tp->address;
    int ret = -ENOENT;

    if (!is_kprobe) {
    map = dso__new_map(tp->module);
    if (!map)
    goto out;
    - addr = tp->address;
    sym = map__find_symbol(map, addr, NULL);
    } else {
    - addr = kernel_get_symbol_address_by_name(tp->symbol, true);
    + if (tp->symbol)
    + addr = kernel_get_symbol_address_by_name(tp->symbol, true);
    if (addr) {
    addr += tp->offset;
    sym = __find_kernel_function(addr, &map);
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-08-25 18:21    [W:3.933 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site