[PATCH v2 3/3] perf header: Fix potential memory corruption in cpu_cache_level__read

From: Ian Rogers

Date: Thu Sep 10 2026 - 13:59:24 EST


strim may advance the pointer assigned to cache->size which causes
later frees to crash. Fix by performing the strim and then memmove-ing
the potentially shifted string back over the original string. The bug
was introduced by the transition from rtrim to strim, as rtrim
wouldn't move on the left.

Fixes: 13c230ab6e56 ("perf tools: Ditch rtrim(), use strim() from tools/lib")
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
Assisted-by: Antigravity:gemini-3.1-pro
---
tools/perf/util/header.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index bdd79d7542ef..78b16a098148 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1267,7 +1267,11 @@ static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 lev
return -1;

cache->type[len] = 0;
- cache->type = strim(cache->type);
+ {
+ char *trimmed = strim(cache->type);
+
+ memmove(cache->type, trimmed, strlen(trimmed) + 1);
+ }

scnprintf(file, PATH_MAX, "%s/size", path);
if (sysfs__read_str(file, &cache->size, &len)) {
@@ -1276,7 +1280,11 @@ static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 lev
}

cache->size[len] = 0;
- cache->size = strim(cache->size);
+ {
+ char *trimmed = strim(cache->size);
+
+ memmove(cache->size, trimmed, strlen(trimmed) + 1);
+ }

scnprintf(file, PATH_MAX, "%s/shared_cpu_list", path);
if (sysfs__read_str(file, &cache->map, &len)) {
@@ -1286,7 +1294,11 @@ static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 lev
}

cache->map[len] = 0;
- cache->map = strim(cache->map);
+ {
+ char *trimmed = strim(cache->map);
+
+ memmove(cache->map, trimmed, strlen(trimmed) + 1);
+ }
return 0;
}

--
2.55.0.1007.g17ff1f9808-goog