]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf tools: Guard remaining test_bit calls from OOB sample CPU
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 4 Jun 2026 21:11:41 +0000 (18:11 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 4 Jun 2026 22:17:36 +0000 (19:17 -0300)
auxtrace.c:filter_cpu() and builtin-script.c:filter_cpu() call
test_bit(cpu, cpu_bitmap) where cpu_bitmap is declared with
MAX_NR_CPUS bits.  When the CPU value from a perf.data event is
corrupt or absent (e.g. negative or >= MAX_NR_CPUS), test_bit reads
out of bounds.

Add bounds checks before test_bit(): >= 0 for the int16_t cpu.cpu in
auxtrace (which also covers the -1 sentinel), and < MAX_NR_CPUS for
both sites.  Matches the pattern applied in the previous series for
builtin-annotate.c, builtin-diff.c, builtin-report.c, and
builtin-sched.c.

Fixes: 644e0840ad46 ("perf auxtrace: Add CPU filter support")
Fixes: 5d67be97f890 ("perf report/annotate/script: Add option to specify a CPU range")
Reported-by: sashiko-bot <sashiko-bot@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Anton Blanchard <anton@samba.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-script.c
tools/perf/util/auxtrace.c

index f4aa255fc3297f90655c1ac7aa340187cb409503..9ac29bdc3cd547e6e61aaee53d57ee5a706f6b47 100644 (file)
@@ -2646,7 +2646,7 @@ static int cleanup_scripting(void)
 
 static bool filter_cpu(struct perf_sample *sample)
 {
-       if (cpu_list && sample->cpu != (u32)-1)
+       if (cpu_list && sample->cpu != (u32)-1 && sample->cpu < MAX_NR_CPUS)
                return !test_bit(sample->cpu, cpu_bitmap);
        return false;
 }
index 5f4aa1701aef649a6872074e7d9594285c48161e..4cd2caf5401522ca761d5c40c56f571698f4ef36 100644 (file)
@@ -372,7 +372,8 @@ static bool filter_cpu(struct perf_session *session, struct perf_cpu cpu)
 {
        unsigned long *cpu_bitmap = session->itrace_synth_opts->cpu_bitmap;
 
-       return cpu_bitmap && cpu.cpu != -1 && !test_bit(cpu.cpu, cpu_bitmap);
+       return cpu_bitmap && cpu.cpu >= 0 && cpu.cpu < MAX_NR_CPUS &&
+              !test_bit(cpu.cpu, cpu_bitmap);
 }
 
 static int auxtrace_queues__add_buffer(struct auxtrace_queues *queues,