]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
libperf cpumap: Fix perf_cpu_map__max for an empty/NULL map
authorIan Rogers <irogers@google.com>
Wed, 3 Dec 2025 21:47:01 +0000 (13:47 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Thu, 4 Dec 2025 08:36:14 +0000 (00:36 -0800)
Passing an empty map to perf_cpu_map__max triggered a SEGV. Explicitly
test for the empty map.

Reported-by: Ingo Molnar <mingo@kernel.org>
Closes: https://lore.kernel.org/linux-perf-users/aSwt7yzFjVJCEmVp@gmail.com/
Tested-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/lib/perf/cpumap.c

index 7e88417ba84d125b95b7e2744a1681702560f23d..4160e7d2e120fea30604ce4c9b6fd395f35bec53 100644 (file)
@@ -368,10 +368,12 @@ struct perf_cpu perf_cpu_map__max(const struct perf_cpu_map *map)
                .cpu = -1
        };
 
-       // cpu_map__trim_new() qsort()s it, cpu_map__default_new() sorts it as well.
-       return __perf_cpu_map__nr(map) > 0
-               ? __perf_cpu_map__cpu(map, __perf_cpu_map__nr(map) - 1)
-               : result;
+       if (!map)
+               return result;
+
+       // The CPUs are always sorted and nr is always > 0 as 0 length map is
+       // encoded as NULL.
+       return __perf_cpu_map__cpu(map, __perf_cpu_map__nr(map) - 1);
 }
 
 /** Is 'b' a subset of 'a'. */