From: sashiko-bot@kernel.org
To: "Arnaldo Carvalho de Melo" <acme@kernel.org>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 03/15] perf config: Move perf_config__set_variable() to util/config.c
Date: Thu, 17 Sep 2026 16:11:04 +0000 [thread overview]
Message-ID: <20260917161104.B01E61F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260917155528.62607-4-acme@kernel.org>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] perf config: data loss due to non-atomic read-modify-write in set_variable
- [Medium] perf config: memory leak due to lockless perf_etc_perfconfig() initialization
--
commit 836076e44736c46148a07294c62bef2cd50992f3
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
perf config: Move perf_config__set_variable() to util/config.c
This commit moves perf_config__set_variable() to util/config.c so that other
utilities can access it. It also serializes config parsing and rewriting
with a mutex to support multithreaded access.
> diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
> --- a/tools/perf/util/config.c
> +++ b/tools/perf/util/config.c
[ ... ]
> @@ -776,8 +788,13 @@ static int collect_config(const char *var, const char *value,
> int perf_config_set__collect(struct perf_config_set *set, const char *file_name,
> const char *var, const char *value)
> {
> + int ret;
> +
> + pthread_mutex_lock(&config_mutex);
> config_file_name = file_name;
[Severity: Medium]
This is a pre-existing issue, but does assigning file_name to the static
global config_file_name create a stack use-after-free risk?
In perf_config__set_variable(), the stack array path is used as the filename
and passed into this function:
perf_config__set_variable() {
char path[PATH_MAX];
...
const char *config_filename = ... ?: mkpath(path, ...);
perf_config_set__collect(..., config_filename, ...);
}
If the static pointer config_file_name isn't cleared after collecting, could
a subsequent config parsing failure in bad_config() dereference this dangling
stack pointer and cause a crash or output garbage?
> - return collect_config(var, value, set);
> + ret = collect_config(var, value, set);
> + pthread_mutex_unlock(&config_mutex);
> + return ret;
> }
[ ... ]
> @@ -876,6 +893,83 @@ void perf_config__exit(void)
[ ... ]
> +int perf_config__set_variable(const char *var, const char *value)
> +{
> + char path[PATH_MAX];
> + char *user_config = mkpath(path, sizeof(path), "%s/.perfconfig", getenv("HOME"));
> + const char *config_filename = config_exclusive_filename ?: user_config;
> + /*
> + * When rewriting the system wide file (e.g. with
> + * PERF_CONFIG=/etc/perfconfig) all entries are marked as coming from it
> + * and must be kept, or the file would be truncated down to its header.
> + */
> + bool system_config = strcmp(config_filename, perf_etc_perfconfig()) == 0;
[Severity: Medium]
Can calling perf_etc_perfconfig() concurrently here lead to a memory leak?
Because perf_etc_perfconfig() checks !system_wide without holding
config_mutex, multiple threads could bypass the check simultaneously and
allocate redundant path strings via system_path(). This could cause all but
the last allocated string to be leaked.
> + struct perf_config_set *set;
> + int ret = -1;
> +
> + set = perf_config_set__new();
> + if (!set)
> + goto out_err;
> +
> + if (perf_config_set__collect(set, config_filename, var, value) < 0) {
> + pr_err("Failed to add '%s=%s'\n", var, value);
> + goto out_err;
> + }
> +
> + if (perf_config_set__write(set, config_filename, system_config) < 0) {
[Severity: Medium]
Can concurrent configuration updates overwrite each other here, causing
data loss?
The sequence of perf_config_set__new(), perf_config_set__collect(), and
perf_config_set__write() drops the config_mutex between each function call.
This appears to break the atomicity of the read-modify-write cycle when
multiple threads invoke perf_config__set_variable() at the same time.
> + pr_err("Failed to set the configs on %s\n", config_filename);
> + goto out_err;
> + }
> +
> + ret = 0;
> +out_err:
> + perf_config_set__delete(set);
> + return ret;
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260917155528.62607-1-acme@kernel.org?part=3
next prev parent reply other threads:[~2026-09-17 16:11 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-17 15:55 [PATCH v7 0/15] perf tools: Annotate fixes, stdio progress indication, debuginfo-client in more places Arnaldo Carvalho de Melo
2026-09-17 15:55 ` [PATCH 01/15] perf debuginfo: Fetch debuginfo keyed by build ID using debuginfod Arnaldo Carvalho de Melo
2026-09-17 16:03 ` sashiko-bot
2026-09-17 17:58 ` Ian Rogers
2026-09-17 20:36 ` Arnaldo Carvalho de Melo
2026-09-17 15:55 ` [PATCH 02/15] perf debuginfo: Set DEBUGINFOD_URLS from /etc/debuginfod when unset Arnaldo Carvalho de Melo
2026-09-17 16:07 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 03/15] perf config: Move perf_config__set_variable() to util/config.c Arnaldo Carvalho de Melo
2026-09-17 16:11 ` sashiko-bot [this message]
2026-09-17 15:55 ` [PATCH 04/15] perf debuginfo: Let the user skip and disable debuginfod fetches Arnaldo Carvalho de Melo
2026-09-17 16:05 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 05/15] perf debuginfo: Show the debuginfod fetch progress and keys in the TUI Arnaldo Carvalho de Melo
2026-09-17 16:09 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 06/15] perf symbol: Fall back to fetching the vmlinux by build ID Arnaldo Carvalho de Melo
2026-09-17 16:08 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 07/15] perf annotate-data: Show the sample count in the data-type browser Arnaldo Carvalho de Melo
2026-09-17 16:04 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 08/15] perf report: Add --progress option Arnaldo Carvalho de Melo
2026-09-17 16:02 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 09/15] perf scripts: Add perf-stuck, to tell where a running perf is stuck Arnaldo Carvalho de Melo
2026-09-17 16:04 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 10/15] perf dwarf-aux: Bound the type chases for broken debug info Arnaldo Carvalho de Melo
2026-09-17 16:03 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 11/15] perf dwarf-aux: Add die_same_file() and die_get_type_die() Arnaldo Carvalho de Melo
2026-09-17 16:09 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 12/15] perf annotate-data: Resolve type DIEs in the debug file they came from Arnaldo Carvalho de Melo
2026-09-17 16:09 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 13/15] perf annotate-data: Bound the member nesting recursion Arnaldo Carvalho de Melo
2026-09-17 16:08 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 14/15] perf mem record: Request PERF_SAMPLE_CPU by default Arnaldo Carvalho de Melo
2026-09-17 16:15 ` sashiko-bot
2026-09-17 15:55 ` [PATCH 15/15] perf mem record: Use the IBS swfilt filter when available Arnaldo Carvalho de Melo
2026-09-17 16:09 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260917161104.B01E61F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=acme@kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox