Skip to content
  • Namhyung Kim's avatar
    perf buildid-list: Fix crash when processing PERF_RECORD_NAMESPACE · 7f0cd236
    Namhyung Kim authored
    
    
    Thomas reported that 'perf buildid-list' gets a SEGFAULT due to NULL
    pointer deref when he ran it on a data with namespace events.  It was
    because the buildid_id__mark_dso_hit_ops lacks the namespace event
    handler and perf_too__fill_default() didn't set it.
    
      Program received signal SIGSEGV, Segmentation fault.
      0x0000000000000000 in ?? ()
      Missing separate debuginfos, use: dnf debuginfo-install audit-libs-2.7.7-1.fc25.s390x bzip2-libs-1.0.6-21.fc25.s390x elfutils-libelf-0.169-1.fc25.s390x
      +elfutils-libs-0.169-1.fc25.s390x libcap-ng-0.7.8-1.fc25.s390x numactl-libs-2.0.11-2.ibm.fc25.s390x openssl-libs-1.1.0e-1.1.ibm.fc25.s390x perl-libs-5.24.1-386.fc25.s390x
      +python-libs-2.7.13-2.fc25.s390x slang-2.3.0-7.fc25.s390x xz-libs-5.2.3-2.fc25.s390x zlib-1.2.8-10.fc25.s390x
      (gdb) where
      #0  0x0000000000000000 in ?? ()
      #1  0x00000000010fad6a in machines__deliver_event (machines=<optimized out>, machines@entry=0x2c6fd18,
          evlist=<optimized out>, event=event@entry=0x3fffdf00470, sample=0x3ffffffe880, sample@entry=0x3ffffffe888,
          tool=tool@entry=0x1312968 <build_id.mark_dso_hit_ops>, file_offset=1136) at util/session.c:1287
      #2  0x00000000010fbf4e in perf_session__deliver_event (file_offset=1136, tool=0x1312968 <build_id.mark_dso_hit_ops>,
          sample=0x3ffffffe888, event=0x3fffdf00470, session=0x2c6fc30) at util/session.c:1340
      #3  perf_session__process_event (session=0x2c6fc30, session@entry=0x0, event=event@entry=0x3fffdf00470,
          file_offset=file_offset@entry=1136) at util/session.c:1522
      #4  0x00000000010fddde in __perf_session__process_events (file_size=11880, data_size=<optimized out>,
          data_offset=<optimized out>, session=0x0) at util/session.c:1899
      #5  perf_session__process_events (session=0x0, session@entry=0x2c6fc30) at util/session.c:1953
      #6  0x000000000103b2ac in perf_session__list_build_ids (with_hits=<optimized out>, force=<optimized out>)
          at builtin-buildid-list.c:83
      #7  cmd_buildid_list (argc=<optimized out>, argv=<optimized out>) at builtin-buildid-list.c:115
      #8  0x00000000010a026c in run_builtin (p=0x1311f78 <commands+24>, argc=argc@entry=2, argv=argv@entry=0x3fffffff3c0)
          at perf.c:296
      #9  0x000000000102bc00 in handle_internal_command (argv=<optimized out>, argc=2) at perf.c:348
      #10 run_argv (argcp=<synthetic pointer>, argv=<synthetic pointer>) at perf.c:392
      #11 main (argc=<optimized out>, argv=0x3fffffff3c0) at perf.c:536
      (gdb)
    
    Fix it by adding a stub event handler for namespace event.
    
    Committer testing:
    
    Further clarifying, plain using 'perf buildid-list' will not end up in a
    SEGFAULT when processing a perf.data file with namespace info:
    
      # perf record -a --namespaces sleep 1
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 2.024 MB perf.data (1058 samples) ]
      # perf buildid-list | wc -l
      38
      # perf buildid-list | head -5
      e2a171c7b905826fc8494f0711ba76ab6abbd604 /lib/modules/4.14.0-rc3+/build/vmlinux
      874840a02d8f8a31cedd605d0b8653145472ced3 /lib/modules/4.14.0-rc3+/kernel/arch/x86/kvm/kvm-intel.ko
      ea7223776730cd8a22f320040aae4d54312984bc /lib/modules/4.14.0-rc3+/kernel/drivers/gpu/drm/i915/i915.ko
      5961535e6732a8edb7f22b3f148bb2fa2e0be4b9 /lib/modules/4.14.0-rc3+/kernel/drivers/gpu/drm/drm.ko
      f045f54aa78cf1931cc893f78b6cbc52c72a8cb1 /usr/lib64/libc-2.25.so
      #
    
    It is only when one asks for checking what of those entries actually had
    samples, i.e. when we use either -H or --with-hits, that we will process
    all the PERF_RECORD_ events, and since tools/perf/builtin-buildid-list.c
    neither explicitely set a perf_tool.namespaces() callback nor the
    default stub was set that we end up, when processing a
    PERF_RECORD_NAMESPACE record, causing a SEGFAULT:
    
      # perf buildid-list -H
      Segmentation fault (core dumped)
      ^C
      #
    
    Reported-and-Tested-by: default avatarThomas-Mich Richter <tmricht@linux.vnet.ibm.com>
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Hari Bathini <hbathini@linux.vnet.ibm.com>
    Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com>
    Fixes: f3b3614a ("perf tools: Add PERF_RECORD_NAMESPACES to include namespaces related info")
    Link: http://lkml.kernel.org/r/20171017132900.11043-1-namhyung@kernel.org
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    7f0cd236