diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2026-07-26 20:40:13 -0300 |
|---|---|---|
| committer | Namhyung Kim <namhyung@kernel.org> | 2026-07-31 16:42:17 -0700 |
| commit | f53bf58dcd11e1cb088d3b91a035fef77062094b (patch) | |
| tree | 2c3bee1b6aca5f163ec59303f150b0019bc4da26 | |
| parent | 29ec46e43f6ca7d6a6651db724d4ffd820f46e8b (diff) | |
perf machine: Free scandir entries in guest kernel map creation
machines__create_guest_kernel_maps() calls scandir() which allocates
both the namelist array and each individual dirent entry. The code
frees the namelist array but not the individual entries, leaking memory
proportional to the number of directories under guestmount.
Free each namelist[i] after it is no longer needed.
Fixes: a1645ce12adb ("perf: 'perf kvm' tool for monitoring guest performance from host")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Cc: Zhang, Yanmin <yanmin_zhang@linux.intel.com>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
| -rw-r--r-- | tools/perf/util/machine.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 1700130adedb..48c4b963e809 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1256,6 +1256,7 @@ int machines__create_guest_kernel_maps(struct machines *machines) for (i = 0; i < items; i++) { if (!isdigit(namelist[i]->d_name[0])) { /* Filter out . and .. */ + free(namelist[i]); continue; } errno = 0; @@ -1265,6 +1266,7 @@ int machines__create_guest_kernel_maps(struct machines *machines) (errno == ERANGE)) { pr_debug("invalid directory (%s). Skipping.\n", namelist[i]->d_name); + free(namelist[i]); continue; } snprintf(path, sizeof(path), "%s/%s/proc/kallsyms", @@ -1272,9 +1274,11 @@ int machines__create_guest_kernel_maps(struct machines *machines) namelist[i]->d_name); if (access(path, R_OK)) { pr_debug("Can't access file %s\n", path); + free(namelist[i]); continue; } machines__create_kernel_maps(machines, pid); + free(namelist[i]); } free(namelist); } |
