• Jiri Olsa's avatar
    perf machine: Fix segfault for kernel.kptr_restrict=2 · 3f938ee2
    Jiri Olsa authored
    
    
    Michael reported the segfault when kernel.kptr_restrict=2 is set.
    
      $ perf record ls
      ...
      perf: Segmentation fault
      Obtained 16 stack frames.
      ./perf(dump_stack+0x2d) [0x5068df]
      ./perf(sighandler_dump_stack+0x2d) [0x5069bf]
      ./perf() [0x43e47b]
      /lib64/libc.so.6(+0x3594f) [0x7f762004794f]
      /lib64/libc.so.6(strlen+0x26) [0x7f762009ef86]
      /lib64/libc.so.6(__strdup+0xd) [0x7f762009ecbd]
      ./perf(maps__set_kallsyms_ref_reloc_sym+0x4d) [0x51590f]
      ./perf(machine__create_kernel_maps+0x136) [0x50a7de]
      ./perf(perf_session__create_kernel_maps+0x2c) [0x510a81]
      ./perf(perf_session__new+0x13d) [0x510e23]
      ./perf() [0x43fd61]
      ./perf(cmd_record+0x704) [0x441823]
      ./perf() [0x4bc1a0]
      ./perf() [0x4bc40d]
      ./perf() [0x4bc55f]
      ./perf(main+0x2d5) [0x4bc939]
      Segmentation fault (core dumped)
    
    The reason is that with kernel.kptr_restrict=2, we don't get
    the symbol from machine__get_running_kernel_start, which we
    want to use in maps__set_kallsyms_ref_reloc_sym and we crash.
    
    Check the symbol name value before calling
    maps__set_kallsyms_ref_reloc_sym() and succeed without ref_reloc_sym
    being set. It's safe because we check its existence before we use it.
    Reported-by: default avatarMichael Petlan <mpetlan@redhat.com>
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20170626095153.553-1-jolsa@kernel.org
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    3f938ee2