• Riccardo Mancini's avatar
    perf machine: Fix refcount usage when processing PERF_RECORD_KSYMBOL · c087e948
    Riccardo Mancini authored
    ASan reported a memory leak of BPF-related ksymbols map and dso. The
    leak is caused by refount never reaching 0, due to missing __put calls
    in the function machine__process_ksymbol_register.
    
    Once the dso is inserted in the map, dso__put() should be called
    (map__new2() increases the refcount to 2).
    
    The same thing applies for the map when it's inserted into maps
    (maps__insert() increases the refcount to 2).
    
      $ sudo ./perf record -- sleep 5
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.025 MB perf.data (8 samples) ]
    
      =================================================================
      ==297735==ERROR: LeakSanitizer: detected memory leaks
    
      Direct leak of 6992 byte(s) in 19 object(s) allocated from:
          #0 0x4f43c7 in calloc (/home/user/linux/tools/perf/perf+0x4f43c7)
          #1 0x8e4e53 in map__new2 /home/user/linux/tools/perf/util/map.c:216:20
          #2 0x8cf68c in machine__process_ksymbol_register /home/user/linux/tools/perf/util/machine.c:778:10
          [...]
    
      Indirect leak of 8702 byte(s) in 19 object(s) allocated from:
          #0 0x4f43c7 in calloc (/home/user/linux/tools/perf/perf+0x4f43c7)
          #1 0x8728d7 in dso__new_id /home/user/linux/tools/perf/util/dso.c:1256:20
          #2 0x872015 in dso__new /home/user/linux/tools/perf/util/dso.c:1295:9
          #3 0x8cf623 in machine__process_ksymbol_register /home/user/linux/tools/perf/util/machine.c:774:21
          [...]
    
      Indirect leak of 1520 byte(s) in 19 object(s) allocated from:
          #0 0x4f43c7 in calloc (/home/user/linux/tools/perf/perf+0x4f43c7)
          #1 0x87b3da in symbol__new /home/user/linux/tools/perf/util/symbol.c:269:23
          #2 0x888954 in map__process_kallsym_symbol /home/user/linux/tools/perf/util/symbol.c:710:8
          [...]
    
      Indirect leak of 1406 byte(s) in 19 object(s) allocated from:
          #0 0x4f43c7 in calloc (/home/user/linux/tools/perf/perf+0x4f43c7)
          #1 0x87b3da in symbol__new /home/user/linux/tools/perf/util/symbol.c:269:23
          #2 0x8cfbd8 in machine__process_ksymbol_register /home/user/linux/tools/perf/util/machine.c:803:8
          [...]
    Signed-off-by: default avatarRiccardo Mancini <rickyman7@gmail.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Tommi Rantala <tommi.t.rantala@nokia.com>
    Link: http://lore.kernel.org/lkml/20210612173751.188582-1-rickyman7@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    c087e948
machine.c 76.6 KB