Commit 7586d11d authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf list: Fix memory leaks in print_tracepoint_events()

It should free entries (not only the array) filled by scandirat()
after use.
Reviewed-by: default avatarIan Rogers <irogers@google.com>
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20230427230502.1526136-1-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent b9f82b5c
...@@ -83,11 +83,11 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus ...@@ -83,11 +83,11 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
if (sys_dirent->d_type != DT_DIR || if (sys_dirent->d_type != DT_DIR ||
!strcmp(sys_dirent->d_name, ".") || !strcmp(sys_dirent->d_name, ".") ||
!strcmp(sys_dirent->d_name, "..")) !strcmp(sys_dirent->d_name, ".."))
continue; goto next_sys;
dir_fd = openat(events_fd, sys_dirent->d_name, O_PATH); dir_fd = openat(events_fd, sys_dirent->d_name, O_PATH);
if (dir_fd < 0) if (dir_fd < 0)
continue; goto next_sys;
evt_items = scandirat(events_fd, sys_dirent->d_name, &evt_namelist, NULL, alphasort); evt_items = scandirat(events_fd, sys_dirent->d_name, &evt_namelist, NULL, alphasort);
for (int j = 0; j < evt_items; j++) { for (int j = 0; j < evt_items; j++) {
...@@ -98,12 +98,12 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus ...@@ -98,12 +98,12 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
if (evt_dirent->d_type != DT_DIR || if (evt_dirent->d_type != DT_DIR ||
!strcmp(evt_dirent->d_name, ".") || !strcmp(evt_dirent->d_name, ".") ||
!strcmp(evt_dirent->d_name, "..")) !strcmp(evt_dirent->d_name, ".."))
continue; goto next_evt;
snprintf(evt_path, sizeof(evt_path), "%s/id", evt_dirent->d_name); snprintf(evt_path, sizeof(evt_path), "%s/id", evt_dirent->d_name);
evt_fd = openat(dir_fd, evt_path, O_RDONLY); evt_fd = openat(dir_fd, evt_path, O_RDONLY);
if (evt_fd < 0) if (evt_fd < 0)
continue; goto next_evt;
close(evt_fd); close(evt_fd);
snprintf(evt_path, MAXPATHLEN, "%s:%s", snprintf(evt_path, MAXPATHLEN, "%s:%s",
...@@ -119,9 +119,13 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus ...@@ -119,9 +119,13 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
/*desc=*/NULL, /*desc=*/NULL,
/*long_desc=*/NULL, /*long_desc=*/NULL,
/*encoding_desc=*/NULL); /*encoding_desc=*/NULL);
next_evt:
free(evt_namelist[j]);
} }
close(dir_fd); close(dir_fd);
free(evt_namelist); free(evt_namelist);
next_sys:
free(sys_namelist[i]);
} }
free(sys_namelist); free(sys_namelist);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment