• Riccardo Mancini's avatar
    perf session: Add missing evlist__delete when deleting a session · cf96b8e4
    Riccardo Mancini authored
    ASan reports a memory leak caused by evlist not being deleted on exit in
    perf-report, perf-script and perf-data.
    The problem is caused by evlist->session not being deleted, which is
    allocated in perf_session__read_header, called in perf_session__new if
    perf_data is in read mode.
    In case of write mode, the session->evlist is filled by the caller.
    This patch solves the problem by calling evlist__delete in
    perf_session__delete if perf_data is in read mode.
    
    Changes in v2:
     - call evlist__delete from within perf_session__delete
    
    v1: https://lore.kernel.org/lkml/20210621234317.235545-1-rickyman7@gmail.com/
    
    ASan report follows:
    
    $ ./perf script report flamegraph
    =================================================================
    ==227640==ERROR: LeakSanitizer: detected memory leaks
    
    <SNIP unrelated>
    
    Indirect leak of 2704 byte(s) in 1 object(s) allocated from:
        #0 0x4f4137 in calloc (/home/user/linux/tools/perf/perf+0x4f4137)
        #1 0xbe3d56 in zalloc /home/user/linux/tools/lib/perf/../../lib/zalloc.c:8:9
        #2 0x7f999e in evlist__new /home/user/linux/tools/perf/util/evlist.c:77:26
        #3 0x8ad938 in perf_session__read_header /home/user/linux/tools/perf/util/header.c:3797:20
        #4 0x8ec714 in perf_session__open /home/user/linux/tools/perf/util/session.c:109:6
        #5 0x8ebe83 in perf_session__new /home/user/linux/tools/perf/util/session.c:213:10
        #6 0x60c6de in cmd_script /home/user/linux/tools/perf/builtin-script.c:3856:12
        #7 0x7b2930 in run_builtin /home/user/linux/tools/perf/perf.c:313:11
        #8 0x7b120f in handle_internal_command /home/user/linux/tools/perf/perf.c:365:8
        #9 0x7b2493 in run_argv /home/user/linux/tools/perf/perf.c:409:2
        #10 0x7b0c89 in main /home/user/linux/tools/perf/perf.c:539:3
        #11 0x7f5260654b74  (/lib64/libc.so.6+0x27b74)
    
    Indirect leak of 568 byte(s) in 1 object(s) allocated from:
        #0 0x4f4137 in calloc (/home/user/linux/tools/perf/perf+0x4f4137)
        #1 0xbe3d56 in zalloc /home/user/linux/tools/lib/perf/../../lib/zalloc.c:8:9
        #2 0x80ce88 in evsel__new_idx /home/user/linux/tools/perf/util/evsel.c:268:24
        #3 0x8aed93 in evsel__new /home/user/linux/tools/perf/util/evsel.h:210:9
        #4 0x8ae07e in perf_session__read_header /home/user/linux/tools/perf/util/header.c:3853:11
        #5 0x8ec714 in perf_session__open /home/user/linux/tools/perf/util/session.c:109:6
        #6 0x8ebe83 in perf_session__new /home/user/linux/tools/perf/util/session.c:213:10
        #7 0x60c6de in cmd_script /home/user/linux/tools/perf/builtin-script.c:3856:12
        #8 0x7b2930 in run_builtin /home/user/linux/tools/perf/perf.c:313:11
        #9 0x7b120f in handle_internal_command /home/user/linux/tools/perf/perf.c:365:8
        #10 0x7b2493 in run_argv /home/user/linux/tools/perf/perf.c:409:2
        #11 0x7b0c89 in main /home/user/linux/tools/perf/perf.c:539:3
        #12 0x7f5260654b74  (/lib64/libc.so.6+0x27b74)
    
    Indirect leak of 264 byte(s) in 1 object(s) allocated from:
        #0 0x4f4137 in calloc (/home/user/linux/tools/perf/perf+0x4f4137)
        #1 0xbe3d56 in zalloc /home/user/linux/tools/lib/perf/../../lib/zalloc.c:8:9
        #2 0xbe3e70 in xyarray__new /home/user/linux/tools/lib/perf/xyarray.c:10:23
        #3 0xbd7754 in perf_evsel__alloc_id /home/user/linux/tools/lib/perf/evsel.c:361:21
        #4 0x8ae201 in perf_session__read_header /home/user/linux/tools/perf/util/header.c:3871:7
        #5 0x8ec714 in perf_session__open /home/user/linux/tools/perf/util/session.c:109:6
        #6 0x8ebe83 in perf_session__new /home/user/linux/tools/perf/util/session.c:213:10
        #7 0x60c6de in cmd_script /home/user/linux/tools/perf/builtin-script.c:3856:12
        #8 0x7b2930 in run_builtin /home/user/linux/tools/perf/perf.c:313:11
        #9 0x7b120f in handle_internal_command /home/user/linux/tools/perf/perf.c:365:8
        #10 0x7b2493 in run_argv /home/user/linux/tools/perf/perf.c:409:2
        #11 0x7b0c89 in main /home/user/linux/tools/perf/perf.c:539:3
        #12 0x7f5260654b74  (/lib64/libc.so.6+0x27b74)
    
    Indirect leak of 32 byte(s) in 1 object(s) allocated from:
        #0 0x4f4137 in calloc (/home/user/linux/tools/perf/perf+0x4f4137)
        #1 0xbe3d56 in zalloc /home/user/linux/tools/lib/perf/../../lib/zalloc.c:8:9
        #2 0xbd77e0 in perf_evsel__alloc_id /home/user/linux/tools/lib/perf/evsel.c:365:14
        #3 0x8ae201 in perf_session__read_header /home/user/linux/tools/perf/util/header.c:3871:7
        #4 0x8ec714 in perf_session__open /home/user/linux/tools/perf/util/session.c:109:6
        #5 0x8ebe83 in perf_session__new /home/user/linux/tools/perf/util/session.c:213:10
        #6 0x60c6de in cmd_script /home/user/linux/tools/perf/builtin-script.c:3856:12
        #7 0x7b2930 in run_builtin /home/user/linux/tools/perf/perf.c:313:11
        #8 0x7b120f in handle_internal_command /home/user/linux/tools/perf/perf.c:365:8
        #9 0x7b2493 in run_argv /home/user/linux/tools/perf/perf.c:409:2
        #10 0x7b0c89 in main /home/user/linux/tools/perf/perf.c:539:3
        #11 0x7f5260654b74  (/lib64/libc.so.6+0x27b74)
    
    Indirect leak of 7 byte(s) in 1 object(s) allocated from:
        #0 0x4b8207 in strdup (/home/user/linux/tools/perf/perf+0x4b8207)
        #1 0x8b4459 in evlist__set_event_name /home/user/linux/tools/perf/util/header.c:2292:16
        #2 0x89d862 in process_event_desc /home/user/linux/tools/perf/util/header.c:2313:3
        #3 0x8af319 in perf_file_section__process /home/user/linux/tools/perf/util/header.c:3651:9
        #4 0x8aa6e9 in perf_header__process_sections /home/user/linux/tools/perf/util/header.c:3427:9
        #5 0x8ae3e7 in perf_session__read_header /home/user/linux/tools/perf/util/header.c:3886:2
        #6 0x8ec714 in perf_session__open /home/user/linux/tools/perf/util/session.c:109:6
        #7 0x8ebe83 in perf_session__new /home/user/linux/tools/perf/util/session.c:213:10
        #8 0x60c6de in cmd_script /home/user/linux/tools/perf/builtin-script.c:3856:12
        #9 0x7b2930 in run_builtin /home/user/linux/tools/perf/perf.c:313:11
        #10 0x7b120f in handle_internal_command /home/user/linux/tools/perf/perf.c:365:8
        #11 0x7b2493 in run_argv /home/user/linux/tools/perf/perf.c:409:2
        #12 0x7b0c89 in main /home/user/linux/tools/perf/perf.c:539:3
        #13 0x7f5260654b74  (/lib64/libc.so.6+0x27b74)
    
    SUMMARY: AddressSanitizer: 3728 byte(s) leaked in 7 allocation(s).
    Signed-off-by: default avatarRiccardo Mancini <rickyman7@gmail.com>
    Acked-by: default avatarIan Rogers <irogers@google.com>
    Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Leo Yan <leo.yan@linaro.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/20210624231926.212208-1-rickyman7@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    cf96b8e4
session.c 68.3 KB