perf list: Fix memory leaks in print_tracepoint_events()
authorNamhyung Kim <namhyung@kernel.org>
Thu, 27 Apr 2023 23:05:01 +0000 (16:05 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 2 May 2023 11:36:14 +0000 (08:36 -0300)
It should free entries (not only the array) filled by scandirat()
after use.

Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung 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.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/print-events.c

index 386b1ab..f5b2ea0 100644 (file)
@@ -83,11 +83,11 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
                if (sys_dirent->d_type != DT_DIR ||
                    !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);
                if (dir_fd < 0)
-                       continue;
+                       goto next_sys;
 
                evt_items = scandirat(events_fd, sys_dirent->d_name, &evt_namelist, NULL, alphasort);
                for (int j = 0; j < evt_items; j++) {
@@ -98,12 +98,12 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
                        if (evt_dirent->d_type != DT_DIR ||
                            !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);
                        evt_fd = openat(dir_fd, evt_path, O_RDONLY);
                        if (evt_fd < 0)
-                               continue;
+                               goto next_evt;
                        close(evt_fd);
 
                        snprintf(evt_path, MAXPATHLEN, "%s:%s",
@@ -119,9 +119,13 @@ void print_tracepoint_events(const struct print_callbacks *print_cb __maybe_unus
                                        /*desc=*/NULL,
                                        /*long_desc=*/NULL,
                                        /*encoding_desc=*/NULL);
+next_evt:
+                       free(evt_namelist[j]);
                }
                close(dir_fd);
                free(evt_namelist);
+next_sys:
+               free(sys_namelist[i]);
        }
 
        free(sys_namelist);