From nobody Fri Oct 2 08:24:48 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 297F841A4F6; Mon, 3 Aug 2026 13:52:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785765120; cv=none; b=cbfjmYZAZd/q7kO4UTHti0YhYCXsDjGWVx/1ICZdzJxki2r2JBXEk3539DD9F4XN5rMlhicrdLOZbszHvxOq5O2Jv2AYzqDJwzclfwT+saZLE8IKtorx5hJviBXx4GYINPDTegeWsRU6/OZsUo2WnUCjVx3LUNtssR6C5pmU8ws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785765120; c=relaxed/simple; bh=ZsG77edvOhH6XVLAwy7LIPSIlfSX56ZFI2RUHuh1Ges=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yf1xf0tNITEcW+jQLCCocYgV1WuEcfSliqbsfkdrCE+eMZM8mHnFZ31Js7DnhQaR2mZ2NJzLIGAPeHXJo6vO4jTWJYvC2Ixvp7xrEuDJNd61N5APA2eU1M//Fl2DG/4QHyAlDGOF7oJVdGLG9kImxGvNd+/kkU42w4Gk3dLFIhU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HhSyIxX3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HhSyIxX3" Received: by smtp.kernel.org (Postfix) with ESMTPS id C79DEC2BCF6; Mon, 3 Aug 2026 13:51:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1785765119; bh=ZsG77edvOhH6XVLAwy7LIPSIlfSX56ZFI2RUHuh1Ges=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=HhSyIxX3IIa/Ji0lGLgiEs1+oCNeylXqiQPjpuzSebuo2DuMQe61O65cEGUBYWn7W XeRw6Dzp7RG18Kub48sllMLoYesTGgRz6u5vYmQqDmjekdgQyTWX2A22M70Iy42j8j f3rSY0KS4vwjFke8ZbhFQsiFo3fxhOqcJwwlxDLH7TuEDs8KuU55VAxt35bRDxnBrx i5eO3A4pHFwdoRJBhnIEYDI3AQRYwPGGJKCv2CCjf+8RlKdfRLNN7i8qI5DfNakiYH aLqUk7Iws56R8YBwaxfgUh+29xl0IP57XnoN/gNmULMZoE+t8gBjSNxY+1346vFUaz 0IPFqSHpOf6SA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5D7CC55182; Mon, 3 Aug 2026 13:51:59 +0000 (UTC) From: Michalis Niarchos via B4 Relay Date: Mon, 03 Aug 2026 15:51:52 +0200 Subject: [PATCH v3 1/3] perf tools: Fix memory leak in cmd_kvm() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260803-perf-kvm-fixes-v3-1-e06268ec06fa@gmail.com> References: <20260803-perf-kvm-fixes-v3-0-e06268ec06fa@gmail.com> In-Reply-To: <20260803-perf-kvm-fixes-v3-0-e06268ec06fa@gmail.com> 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@vger.kernel.org, linux-kernel@vger.kernel.org, Michalis Niarchos X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1785765118; l=1401; i=michael.niarchos@gmail.com; s=20260731; h=from:subject:message-id; bh=g8MhihpU3z6FgOHyL6TpVKQEHy5oaO74U3jKb0sNYoY=; b=BbRDa2JL+T5vHyyCpP1ffABm/DHENH52ZcIixvt5R+vfjvE4bHm9TXCeYzkjepYGFE17yRfwp kJ0Oa4an6p1CKk+vy+ZE9JgCNLaI2P3PW2iYhyOqtAcvw9w7Cg9IUa9 X-Developer-Key: i=michael.niarchos@gmail.com; a=ed25519; pk=/LBZRQzfuxTnSaZhgZE8EP7mHr0poyqlKeFssNqkzFE= X-Endpoint-Received: by B4 Relay for michael.niarchos@gmail.com/20260731 with auth_id=912 X-Original-From: Michalis Niarchos Reply-To: michael.niarchos@gmail.com From: Michalis Niarchos 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 --- tools/perf/builtin-kvm.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 394302ebdb16..16cfa7ce7856 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; =20 if (perf_host && !perf_guest) - filename =3D strdup("perf.data.host"); + filename =3D "perf.data.host"; else if (!perf_host && perf_guest) - filename =3D strdup("perf.data.guest"); + filename =3D "perf.data.guest"; else - filename =3D strdup("perf.data.kvm"); + filename =3D "perf.data.kvm"; =20 return filename; } @@ -2158,15 +2158,9 @@ int cmd_kvm(int argc, const char **argv) if (!perf_host) perf_guest =3D 1; =20 - if (!file_name) { + if (!file_name) file_name =3D get_filename_for_perf_kvm(); =20 - if (!file_name) { - pr_err("Failed to allocate memory for filename\n"); - return -ENOMEM; - } - } - 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])) --=20 2.55.0 From nobody Fri Oct 2 08:24:48 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 298B341A4F8; Mon, 3 Aug 2026 13:52:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785765120; cv=none; b=eB7Au1sW4vCyyg9oHOHx2Gph6fypT7qEQOzv+ENUpuSAZctXjGw4f/zaV+GUIke2goirZWkbWgQIhk0oE/GZJJMK4li/RmU0eqf5zwzhaOF5SV7sr+J1dM11Gv+UQ4VRLyeYYoQ1Qh+uOSiXHZVbeQBqxVyeQdBOi6jV/u9mu2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785765120; c=relaxed/simple; bh=bjd+dx76baLZRoTBIv1V7NebSOO9zBQIv9I4rk4CyfI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hY/jXc2nHjTdSssQSIPlDz0CAFcq4+DTih/kPBU3dKghKDHFAup1j/BbGmMTdRjiAEVBB/akS1S4A0fMEibgtBjnVfW71QDM9YyS/RPAhY8FP9jcmrl617a/HZ7g+gifoq+mWdjwk8/HNd1Xn5UcXTH4FnsIMYpjYCvGXS8e09Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DL2CRTHk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DL2CRTHk" Received: by smtp.kernel.org (Postfix) with ESMTPS id D245AC2BCF7; Mon, 3 Aug 2026 13:51:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1785765119; bh=bjd+dx76baLZRoTBIv1V7NebSOO9zBQIv9I4rk4CyfI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=DL2CRTHkyif8ee21N21p5XqBs/ACNsuFyiQEGmyNG6EZ4QcANBz2yBHtmFvWH0pzr pwCza5ciTNJc/+qb3IvYckzOheg7WfJF9vkYcCqCWDOnDdLkFEGsfhceLAxsSV705H ExwIq1YJv87Bz6DnuGB4tgkOVZWaK6ujHGXMcnoqkpETUGTWsqKC8OfjCy6x1WrT+5 QmA1qSmIrfDVeMpqhORTd8X8/W4QOQ8aK1F1OiLYtFDQFhogesXFjoK96bnEv/9ZWy TclGqOa3yV0GawiDW0af7MDM0OZR5jOSVQCur6/Xr76XLKAT8vCvzL/y7DsY+oM0hZ Wyh0kIpSG/e0Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B664AC5518F; Mon, 3 Aug 2026 13:51:59 +0000 (UTC) From: Michalis Niarchos via B4 Relay Date: Mon, 03 Aug 2026 15:51:53 +0200 Subject: [PATCH v3 2/3] perf tools: Fix double free and memory leak issues Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260803-perf-kvm-fixes-v3-2-e06268ec06fa@gmail.com> References: <20260803-perf-kvm-fixes-v3-0-e06268ec06fa@gmail.com> In-Reply-To: <20260803-perf-kvm-fixes-v3-0-e06268ec06fa@gmail.com> 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@vger.kernel.org, linux-kernel@vger.kernel.org, Michalis Niarchos X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1785765118; l=6450; i=michael.niarchos@gmail.com; s=20260731; h=from:subject:message-id; bh=pJlrs2g9K4W+VPjPzId6fOvC6ZaAAwlqcisBbFjHGDQ=; b=wlwDVDvesTS+7ow5n9HZXUAhYE/xzE6YaTzvh7Lh6YDlOyj9tyqBAUW0v23osz7d7Sa0fC29/ rTaiu32VXrjAs8ZUVfN6ctdpzEu947hY0zlSIk7oCoFUFt9afVUNyBK X-Developer-Key: i=michael.niarchos@gmail.com; a=ed25519; pk=/LBZRQzfuxTnSaZhgZE8EP7mHr0poyqlKeFssNqkzFE= X-Endpoint-Received: by B4 Relay for michael.niarchos@gmail.com/20260731 with auth_id=912 X-Original-From: Michalis Niarchos Reply-To: michael.niarchos@gmail.com From: Michalis Niarchos parse_options() 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 the respective call. Reference them directly instead of duplicating to remove the need to individually track and free each entry. Signed-off-by: Michalis Niarchos --- tools/perf/builtin-kvm.c | 51 +++++++++-----------= ---- tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c | 4 +- tools/perf/util/kvm-stat-arch/kvm-stat-x86.c | 10 ++--- 3 files changed, 24 insertions(+), 41 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 16cfa7ce7856..8e14d037d7d9 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 ar= gc, const char **argv) return -ENOMEM; =20 for (i =3D 0; i < ARRAY_SIZE(record_args); i++) - rec_argv[i] =3D STRDUP_FAIL_EXIT(record_args[i]); + rec_argv[i] =3D record_args[i]; =20 for (j =3D 0; j < events_tp_size; j++) { - rec_argv[i++] =3D STRDUP_FAIL_EXIT("-e"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(kvm_events_tp(e_machine)[j]); + rec_argv[i++] =3D "-e"; + rec_argv[i++] =3D kvm_events_tp(e_machine)[j]; } =20 - rec_argv[i++] =3D STRDUP_FAIL_EXIT("-o"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(kvm->file_name); + rec_argv[i++] =3D "-o"; + rec_argv[i++] =3D kvm->file_name; =20 for (j =3D 1; j < (unsigned int)argc; j++, i++) - rec_argv[i] =3D STRDUP_FAIL_EXIT(argv[j]); + rec_argv[i] =3D argv[j]; =20 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 =3D kvm_stat_record_usage; ret =3D cmd_record(i, rec_argv); =20 -EXIT: - for (i =3D 0; i < rec_argc; i++) - free((void *)rec_argv[i]); free(rec_argv); return ret; } @@ -2006,11 +2003,11 @@ static int __cmd_record(const char *file_name, int = argc, const char **argv) if (!rec_argv) return -ENOMEM; =20 - rec_argv[i++] =3D STRDUP_FAIL_EXIT("record"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT("-o"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(file_name); + rec_argv[i++] =3D "record"; + rec_argv[i++] =3D "-o"; + rec_argv[i++] =3D file_name; for (j =3D 1; j < argc; j++, i++) - rec_argv[i] =3D STRDUP_FAIL_EXIT(argv[j]); + rec_argv[i] =3D argv[j]; =20 BUG_ON(i + 2 !=3D rec_argc); =20 @@ -2021,8 +2018,6 @@ static int __cmd_record(const char *file_name, int ar= gc, const char **argv) ret =3D cmd_record(i, rec_argv); =20 EXIT: - for (i =3D 0; i < rec_argc; i++) - free((void *)rec_argv[i]); free(rec_argv); return ret; } @@ -2037,19 +2032,16 @@ static int __cmd_report(const char *file_name, int = argc, const char **argv) if (!rec_argv) return -ENOMEM; =20 - rec_argv[i++] =3D STRDUP_FAIL_EXIT("report"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT("-i"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(file_name); + rec_argv[i++] =3D "report"; + rec_argv[i++] =3D "-i"; + rec_argv[i++] =3D file_name; for (j =3D 1; j < argc; j++, i++) - rec_argv[i] =3D STRDUP_FAIL_EXIT(argv[j]); + rec_argv[i] =3D argv[j]; =20 BUG_ON(i !=3D rec_argc); =20 ret =3D cmd_report(i, rec_argv); =20 -EXIT: - for (i =3D 0; i < rec_argc; i++) - free((void *)rec_argv[i]); free(rec_argv); return ret; } @@ -2065,19 +2057,16 @@ __cmd_buildid_list(const char *file_name, int argc,= const char **argv) if (!rec_argv) return -ENOMEM; =20 - rec_argv[i++] =3D STRDUP_FAIL_EXIT("buildid-list"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT("-i"); - rec_argv[i++] =3D STRDUP_FAIL_EXIT(file_name); + rec_argv[i++] =3D "buildid-list"; + rec_argv[i++] =3D "-i"; + rec_argv[i++] =3D file_name; for (j =3D 1; j < argc; j++, i++) - rec_argv[i] =3D STRDUP_FAIL_EXIT(argv[j]); + rec_argv[i] =3D argv[j]; =20 BUG_ON(i !=3D rec_argc); =20 ret =3D cmd_buildid_list(i, rec_argv); =20 -EXIT: - for (i =3D 0; i < rec_argc; i++) - free((void *)rec_argv[i]); free(rec_argv); return ret; } @@ -2097,7 +2086,7 @@ static int __cmd_top(int argc, const char **argv) return -ENOMEM; =20 for (i =3D 0; i < argc; i++) - rec_argv[i] =3D STRDUP_FAIL_EXIT(argv[i]); + rec_argv[i] =3D argv[i]; =20 BUG_ON(i !=3D argc); =20 @@ -2108,8 +2097,6 @@ static int __cmd_top(int argc, const char **argv) ret =3D cmd_top(i, rec_argv); =20 EXIT: - for (i =3D 0; i < rec_argc; i++) - free((void *)rec_argv[i]); free(rec_argv); return ret; } diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c b/tools/perf/= util/kvm-stat-arch/kvm-stat-powerpc.c index 96d9c4ae0209..37f36c6bf895 100644 --- a/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-powerpc.c @@ -196,8 +196,8 @@ int __kvm_add_default_arch_event_powerpc(int *argc, con= st char **argv) parse_options(j, tmp, event_options, NULL, PARSE_OPT_KEEP_UNKNOWN); if (!event) { if (perf_pmus__have_event("trace_imc", "trace_cycles")) { - argv[j++] =3D strdup("-e"); - argv[j++] =3D strdup("trace_imc/trace_cycles/"); + argv[j++] =3D "-e"; + argv[j++] =3D "trace_imc/trace_cycles/"; *argc +=3D 2; } else { free(tmp); diff --git a/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c b/tools/perf/util= /kvm-stat-arch/kvm-stat-x86.c index 788d216f0852..67babdd3daf1 100644 --- a/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c +++ b/tools/perf/util/kvm-stat-arch/kvm-stat-x86.c @@ -213,7 +213,7 @@ int __kvm_add_default_arch_event_x86(int *argc, const c= har **argv) { const char **tmp; bool event =3D false; - int ret =3D 0, i, j =3D *argc; + int i, j =3D *argc; =20 const struct option event_options[] =3D { OPT_BOOLEAN('e', "event", &event, NULL), @@ -233,17 +233,13 @@ int __kvm_add_default_arch_event_x86(int *argc, const= char **argv) =20 parse_options(j, tmp, event_options, NULL, PARSE_OPT_KEEP_UNKNOWN); if (!event) { - argv[j++] =3D STRDUP_FAIL_EXIT("-e"); - argv[j++] =3D STRDUP_FAIL_EXIT("cycles"); + argv[j++] =3D "-e"; + argv[j++] =3D "cycles"; *argc +=3D 2; } =20 free(tmp); return 0; - -EXIT: - free(tmp); - return ret; } =20 const char * const *__kvm_events_tp_x86(void) --=20 2.55.0 From nobody Fri Oct 2 08:24:48 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2968840DB25; Mon, 3 Aug 2026 13:52:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785765120; cv=none; b=EnIDabtZtvp1FJDSwyHDvtjsVzy6mU9ify+mnOV8NxPlLg8qVGLNdIRVxZYxIboHeImLvToJVVSee2qd7lPbW7hdLmz2wRNfjt4+EaKF/w32BbDRrDJH1IWvdLCHqwA8vpgDmPW2vvTCmEwxOQZMZgTJDW2ULgZRIy0yRSt/2Vc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785765120; c=relaxed/simple; bh=PJ1AXo1bE4Xib7XSRHSemd8i5WPgCv3avsMGp3YygL0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QkXCTl288RMY3w7fwdR1feO/FarowRJGKEASHqj9/ADEvLrMO3jm6P8xIZ2M67MSspVTjF9aMMORRjuvGawBYx5aNPyFmWB6tS4Opom0v3wow4im2lYmv6bFPutyQIchSw+FZwkpdc37xoIN+WrZSPoPyGWbaltza6JjH+TTrRg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iljXzuR+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iljXzuR+" Received: by smtp.kernel.org (Postfix) with ESMTPS id DCA85C2BCFD; Mon, 3 Aug 2026 13:51:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1785765119; bh=PJ1AXo1bE4Xib7XSRHSemd8i5WPgCv3avsMGp3YygL0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=iljXzuR+5OmfdH9dSaAaiEzxSIH11uqyrp+TPTOzX+fKUSvvKqhLQRX4c2owm1EcP 6sx3XANfPnbnwv2Qc68EKfJCwW4Q/LxniBUrIbrUNr0Cbk9qhvZ+NjIiHLya+sCfg/ l44actuZxot2amIsyy/G5CHdtSe9XCqg5xa9LrbpUg1YQZSvcCCdfcYWdn6sq2EgOM XKE1oGSDKNYUZMJRzKz8ENtKhowQVPSSNv/IO8oBfp8SKfmEYNt9+Hzn7QY1FD6t56 lQBEshVwjriDSsaEJKx5CEOYki4xNxGPbUbAwSOZ26MOYTaqDOqFe9c/e7Mtx2yM6W ZxgpiScnTZKzw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6143C55179; Mon, 3 Aug 2026 13:51:59 +0000 (UTC) From: Michalis Niarchos via B4 Relay Date: Mon, 03 Aug 2026 15:51:54 +0200 Subject: [PATCH v3 3/3] perf tools: Fix memory leak in cmd_kvm() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260803-perf-kvm-fixes-v3-3-e06268ec06fa@gmail.com> References: <20260803-perf-kvm-fixes-v3-0-e06268ec06fa@gmail.com> In-Reply-To: <20260803-perf-kvm-fixes-v3-0-e06268ec06fa@gmail.com> 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@vger.kernel.org, linux-kernel@vger.kernel.org, Michalis Niarchos X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1785765118; l=2577; i=michael.niarchos@gmail.com; s=20260731; h=from:subject:message-id; bh=B7Sv0QwuZKxlNQr0I80Lih/KewWi/BiAYs14XtbWNDU=; b=cFuraravjFmqBCMXVT84PwL5QT8273nbZCySTuEdsjJMW0LBZyoIfW+j3L/qqXkQcF3FtbCFn TQTFSENnlZ2Bjndc8DJDxNA9pzmaxFxRxBVvD6AoXNe0cYRCV7UiF7t X-Developer-Key: i=michael.niarchos@gmail.com; a=ed25519; pk=/LBZRQzfuxTnSaZhgZE8EP7mHr0poyqlKeFssNqkzFE= X-Endpoint-Received: by B4 Relay for michael.niarchos@gmail.com/20260731 with auth_id=912 X-Original-From: Michalis Niarchos Reply-To: michael.niarchos@gmail.com From: Michalis Niarchos 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 --- tools/perf/builtin-kvm.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 8e14d037d7d9..04cf9bd5b595 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -2132,6 +2132,7 @@ int cmd_kvm(int argc, const char **argv) const char *const kvm_subcommands[] =3D { "top", "record", "report", "dif= f", "buildid-list", "stat", NULL }; const char *kvm_usage[] =3D { NULL, NULL }; + int ret =3D 0; =20 exclude_GH_default =3D true; perf_host =3D 0; @@ -2148,25 +2149,34 @@ int cmd_kvm(int argc, const char **argv) if (!file_name) file_name =3D get_filename_for_perf_kvm(); =20 - 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 =3D __cmd_record(file_name, argc, argv); + goto exit; + } else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) { + ret =3D __cmd_report(file_name, argc, argv); + goto exit; + } else if (strlen(argv[0]) > 2 && strstarts("diff", argv[0])) { + ret =3D cmd_diff(argc, argv); + goto exit; + } else if (!strcmp(argv[0], "top")) { + ret =3D __cmd_top(argc, argv); + goto exit; + } else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0])) { + ret =3D __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 =3D kvm_cmd_stat(file_name, argc, argv); + goto exit; + } #endif else usage_with_options(kvm_usage, kvm_options); =20 +exit: /* free usage string allocated by parse_options_subcommand */ free((void *)kvm_usage[0]); =20 - return 0; + return ret; } --=20 2.55.0