* [PATCH 0/4] perf tools: Fix memory issues
@ 2026-08-03 10:33 Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 1/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Michalis Niarchos via B4 Relay @ 2026-08-03 10:33 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-perf-users, linux-kernel, Michalis Niarchos
Running:
$ perf kvm stat record -a sleep 10
gives this output:
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.361 MB perf.data.guest ]
double free or corruption (!prev)
In the process of resolving this, I came across some memory leaks.
Signed-off-by: Michalis Niarchos <michael.niarchos@gmail.com>
---
Michalis Niarchos (4):
perf tools: Fix memory leak in cmd_kvm()
perf tools: Fix memory leak in kvm_events_report()
perf tools: Fix double free and memory leak in kvm_events_record()
perf tools: Fix memory leak in cmd_kvm()
tools/perf/builtin-kvm.c | 63 ++++++++++++++++++++++++++++--------------------
1 file changed, 37 insertions(+), 26 deletions(-)
---
base-commit: 2162d9b24ba1a9a402baabe5382b33e792aa074f
change-id: 20260731-perf-kvm-fixes-a17f0aa048ad
Best regards,
--
Michalis Niarchos <michael.niarchos@gmail.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/4] perf tools: Fix memory leak in cmd_kvm()
2026-08-03 10:33 [PATCH 0/4] perf tools: Fix memory issues Michalis Niarchos via B4 Relay
@ 2026-08-03 10:33 ` Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 2/4] perf tools: Fix memory leak in kvm_events_report() Michalis Niarchos via B4 Relay
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Michalis Niarchos via B4 Relay @ 2026-08-03 10:33 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-perf-users, linux-kernel, Michalis Niarchos
From: Michalis Niarchos <michael.niarchos@gmail.com>
filename may get allocated by get_filename_for_perf_kvm(), but is
never freed. Use string literals to remove the need for freeing.
Signed-off-by: Michalis Niarchos <michael.niarchos@gmail.com>
---
tools/perf/builtin-kvm.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 394302ebdb16..44c6998f2ee5 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -606,11 +606,11 @@ static const char *get_filename_for_perf_kvm(void)
const char *filename;
if (perf_host && !perf_guest)
- filename = strdup("perf.data.host");
+ filename = "perf.data.host";
else if (!perf_host && perf_guest)
- filename = strdup("perf.data.guest");
+ filename = "perf.data.guest";
else
- filename = strdup("perf.data.kvm");
+ filename = "perf.data.kvm";
return filename;
}
--
2.55.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/4] perf tools: Fix memory leak in kvm_events_report()
2026-08-03 10:33 [PATCH 0/4] perf tools: Fix memory issues Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 1/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
@ 2026-08-03 10:33 ` Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 3/4] perf tools: Fix double free and memory leak in kvm_events_record() Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 4/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
3 siblings, 0 replies; 5+ messages in thread
From: Michalis Niarchos via B4 Relay @ 2026-08-03 10:33 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-perf-users, linux-kernel, Michalis Niarchos
From: Michalis Niarchos <michael.niarchos@gmail.com>
parse_options() calls parse_options_subcommand(), which allocates the
usage string. Free it.
Signed-off-by: Michalis Niarchos <michael.niarchos@gmail.com>
---
tools/perf/builtin-kvm.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 44c6998f2ee5..1a013698cae3 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -1755,6 +1755,9 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
if (argc)
usage_with_options(kvm_events_report_usage,
kvm_events_report_options);
+
+ /* free usage string allocated by parse_options */
+ free((void *)kvm_events_report_usage[0]);
}
#ifndef HAVE_SLANG_SUPPORT
--
2.55.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3/4] perf tools: Fix double free and memory leak in kvm_events_record()
2026-08-03 10:33 [PATCH 0/4] perf tools: Fix memory issues Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 1/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 2/4] perf tools: Fix memory leak in kvm_events_report() Michalis Niarchos via B4 Relay
@ 2026-08-03 10:33 ` Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 4/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
3 siblings, 0 replies; 5+ messages in thread
From: Michalis Niarchos via B4 Relay @ 2026-08-03 10:33 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-perf-users, linux-kernel, Michalis Niarchos
From: Michalis Niarchos <michael.niarchos@gmail.com>
cmd_record() reorders the contents of the rec_argv pointer array, so
its entry order no longer matches the order in which the caller
originally allocated them. Freeing the contents of rec_argv by
iterating the reordered array results in some pointers being freed
twice and others never freed.
All the entries of rec_argv come from literals or pointers that are
valid for the lifetime of this call. Reference them directly instead
of duplicating to remove the need to individually track and free each
entry.
Signed-off-by: Michalis Niarchos <michael.niarchos@gmail.com>
---
tools/perf/builtin-kvm.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 1a013698cae3..189ef3576e34 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -1681,18 +1681,18 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(record_args); i++)
- rec_argv[i] = STRDUP_FAIL_EXIT(record_args[i]);
+ rec_argv[i] = record_args[i];
for (j = 0; j < events_tp_size; j++) {
- rec_argv[i++] = STRDUP_FAIL_EXIT("-e");
- rec_argv[i++] = STRDUP_FAIL_EXIT(kvm_events_tp(e_machine)[j]);
+ rec_argv[i++] = "-e";
+ rec_argv[i++] = kvm_events_tp(e_machine)[j];
}
- rec_argv[i++] = STRDUP_FAIL_EXIT("-o");
- rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name);
+ rec_argv[i++] = "-o";
+ rec_argv[i++] = kvm->file_name;
for (j = 1; j < (unsigned int)argc; j++, i++)
- rec_argv[i] = STRDUP_FAIL_EXIT(argv[j]);
+ rec_argv[i] = argv[j];
set_option_flag(record_options, 'e', "event", PARSE_OPT_HIDDEN);
set_option_flag(record_options, 0, "filter", PARSE_OPT_HIDDEN);
@@ -1717,9 +1717,6 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
record_usage = kvm_stat_record_usage;
ret = cmd_record(i, rec_argv);
-EXIT:
- for (i = 0; i < rec_argc; i++)
- free((void *)rec_argv[i]);
free(rec_argv);
return ret;
}
--
2.55.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 4/4] perf tools: Fix memory leak in cmd_kvm()
2026-08-03 10:33 [PATCH 0/4] perf tools: Fix memory issues Michalis Niarchos via B4 Relay
` (2 preceding siblings ...)
2026-08-03 10:33 ` [PATCH 3/4] perf tools: Fix double free and memory leak in kvm_events_record() Michalis Niarchos via B4 Relay
@ 2026-08-03 10:33 ` Michalis Niarchos via B4 Relay
3 siblings, 0 replies; 5+ messages in thread
From: Michalis Niarchos via B4 Relay @ 2026-08-03 10:33 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, James Clark
Cc: linux-perf-users, linux-kernel, Michalis Niarchos
From: Michalis Niarchos <michael.niarchos@gmail.com>
The usage string is allocated by parse_options_subcommand() and freed
only on one return path. Using a single return point guarantees it is
freed on all occasions.
Signed-off-by: Michalis Niarchos <michael.niarchos@gmail.com>
---
tools/perf/builtin-kvm.c | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 189ef3576e34..56062c305db1 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -2145,6 +2145,7 @@ int cmd_kvm(int argc, const char **argv)
const char *const kvm_subcommands[] = { "top", "record", "report", "diff",
"buildid-list", "stat", NULL };
const char *kvm_usage[] = { NULL, NULL };
+ int ret = 0;
exclude_GH_default = true;
perf_host = 0;
@@ -2163,29 +2164,39 @@ int cmd_kvm(int argc, const char **argv)
if (!file_name) {
pr_err("Failed to allocate memory for filename\n");
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto exit;
}
}
- if (strlen(argv[0]) > 2 && strstarts("record", argv[0]))
- return __cmd_record(file_name, argc, argv);
- else if (strlen(argv[0]) > 2 && strstarts("report", argv[0]))
- return __cmd_report(file_name, argc, argv);
- else if (strlen(argv[0]) > 2 && strstarts("diff", argv[0]))
- return cmd_diff(argc, argv);
- else if (!strcmp(argv[0], "top"))
- return __cmd_top(argc, argv);
- else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
- return __cmd_buildid_list(file_name, argc, argv);
+ if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
+ ret = __cmd_record(file_name, argc, argv);
+ goto exit;
+ } else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) {
+ ret = __cmd_report(file_name, argc, argv);
+ goto exit;
+ } else if (strlen(argv[0]) > 2 && strstarts("diff", argv[0])) {
+ ret = cmd_diff(argc, argv);
+ goto exit;
+ } else if (!strcmp(argv[0], "top")) {
+ ret = __cmd_top(argc, argv);
+ goto exit;
+ } else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0])) {
+ ret = __cmd_buildid_list(file_name, argc, argv);
+ goto exit;
+ }
#if defined(HAVE_LIBTRACEEVENT)
- else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
- return kvm_cmd_stat(file_name, argc, argv);
+ else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0])) {
+ ret = kvm_cmd_stat(file_name, argc, argv);
+ goto exit;
+ }
#endif
else
usage_with_options(kvm_usage, kvm_options);
+exit:
/* free usage string allocated by parse_options_subcommand */
free((void *)kvm_usage[0]);
- return 0;
+ return ret;
}
--
2.55.0
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-03 10:33 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-03 10:33 [PATCH 0/4] perf tools: Fix memory issues Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 1/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 2/4] perf tools: Fix memory leak in kvm_events_report() Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 3/4] perf tools: Fix double free and memory leak in kvm_events_record() Michalis Niarchos via B4 Relay
2026-08-03 10:33 ` [PATCH 4/4] perf tools: Fix memory leak in cmd_kvm() Michalis Niarchos via B4 Relay
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®