From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Namhyung Kim <namhyung@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
James Clark <james.clark@linaro.org>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Clark Williams <williams@redhat.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Arnaldo Carvalho de Melo <acme@kernel.org>
Subject: [PATCHES v2 0/9] perf tools: Fix OOB writes, refcount bugs, and BUG_ON in mmap/stat/c2c/sched
Date: Fri, 5 Jun 2026 20:38:28 -0300 [thread overview]
Message-ID: <20260605233837.1773732-1-acme@kernel.org> (raw)
Hi,
Nine more pre-existing bugs found by sashiko-bot during AI-assisted
review of the perf-data-validation hardening series. All are
independent of that series -- they are latent bugs in surrounding code
exposed during review.
1. perf_mmap__aio_bind() passes cpu__get_node() return value to an
unsigned long. When -1 is returned, sign-extension to ULONG_MAX
causes bitmap_zalloc(0) and a massive OOB __set_bit.
2. Six perf_env__get_*_aggr_by_cpu() topology aggregation callbacks
in builtin-stat.c access env->cpu[cpu.cpu] after only checking
cpu.cpu != -1. A CPU index from untrusted perf.data exceeding
env->nr_cpus_avail causes OOB heap reads.
3. perf c2c: __set_bit on cpuset/nodeset bitmaps without bounds
checking sample->cpu and node IDs against their allocation sizes.
Also, cpu2node[] array accessed without upper bound check.
4. perf c2c: setup_nodes() iterates CPU maps from perf.data topology
and uses cpu.cpu directly as index into cpu2node[] and __set_bit
without validating against nr_cpus_avail.
5. get_idle_thread() leaves a partially initialized thread in
idle_threads[] when init_idle_thread() fails, causing subsequent
calls to return a thread with no priv data -- later cast to a
larger struct causes OOB writes.
6. timehist_sched_change_event() uses thread__tid() == 0 to guard
a cast from thread_runtime to idle_thread_runtime. A crafted
perf.data with common_pid=0 but prev_pid!=0 gets a machine
thread with thread_runtime priv -- the cast reads past the
allocation.
7. timehist_sched_change_event() sets itr->last_thread to NULL
without calling thread__put() first, leaking a thread reference
on every idle context switch with --idle-hist.
8. free_idle_threads() calls thread__delete() directly instead of
thread__put(), bypassing the refcount lifecycle.
9. get_new_event() dereferences unchecked zalloc() result and uses
BUG_ON on realloc failure. add_sched_event_wakeup() passes
unchecked zalloc() to sem_init(). All crash on OOM with
untrusted input.
All require crafted or unusual perf.data inputs to trigger.
Verified with gcc and clang builds, checkpatch, and perf test.
Arnaldo Carvalho de Melo (9):
perf mmap: Guard cpu__get_node() return in aio_bind()
perf stat: Bounds-check CPU index in topology aggregation callbacks
perf c2c: Bounds-check CPU and node IDs before bitmap and array access
perf c2c: Bounds-check CPU IDs in setup_nodes() topology loop
perf sched: Clean up idle_threads entry on init failure
perf sched: Use is_idle_sample() for idle thread runtime cast guard
perf sched: Fix thread reference leak in idle hist processing
perf sched: Use thread__put() in free_idle_threads()
perf sched: Replace BUG_ON and add NULL checks in replay event helpers
tools/perf/builtin-c2c.c | 23 +++++++++++++++++++++--
tools/perf/builtin-sched.c | 45 ++++++++++++++++++++++++++++++++++++++-------
tools/perf/builtin-stat.c | 13 +++++++------
tools/perf/util/mmap.c | 8 +++++++-
4 files changed, 73 insertions(+), 16 deletions(-)
Developed with AI assistance (Claude/sashiko), tagged in commits.
v2:
- New patch 6: use is_idle_sample() instead of thread__tid() == 0
to guard idle_thread_runtime cast, preventing OOB read/arbitrary
free with crafted common_pid=0/prev_pid!=0 events (sashiko Critical
on v1 patch 6)
- Patch 3: add cpu < 0 check to catch large u32 sample->cpu values
that wrap negative when assigned to signed int, bypassing the
>= cpus_cnt bounds check (sashiko High on v1 patch 3)
Thanks,
- Arnaldo
next reply other threads:[~2026-06-05 23:38 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-05 23:38 Arnaldo Carvalho de Melo [this message]
2026-06-05 23:38 ` [PATCH 1/9] perf mmap: Guard cpu__get_node() return in aio_bind() Arnaldo Carvalho de Melo
2026-06-05 23:56 ` sashiko-bot
2026-06-05 23:38 ` [PATCH 2/9] perf stat: Bounds-check CPU index in topology aggregation callbacks Arnaldo Carvalho de Melo
2026-06-05 23:55 ` sashiko-bot
2026-06-05 23:38 ` [PATCH 3/9] perf c2c: Bounds-check CPU and node IDs before bitmap and array access Arnaldo Carvalho de Melo
2026-06-05 23:54 ` sashiko-bot
2026-06-05 23:38 ` [PATCH 4/9] perf c2c: Bounds-check CPU IDs in setup_nodes() topology loop Arnaldo Carvalho de Melo
2026-06-05 23:38 ` [PATCH 5/9] perf sched: Clean up idle_threads entry on init failure Arnaldo Carvalho de Melo
2026-06-05 23:56 ` sashiko-bot
2026-06-05 23:38 ` [PATCH 6/9] perf sched: Use is_idle_sample() for idle thread runtime cast guard Arnaldo Carvalho de Melo
2026-06-05 23:38 ` [PATCH 7/9] perf sched: Fix thread reference leak in idle hist processing Arnaldo Carvalho de Melo
2026-06-05 23:56 ` sashiko-bot
2026-06-05 23:38 ` [PATCH 8/9] perf sched: Use thread__put() in free_idle_threads() Arnaldo Carvalho de Melo
2026-06-05 23:38 ` [PATCH 9/9] perf sched: Replace BUG_ON and add NULL checks in replay event helpers Arnaldo Carvalho de Melo
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=20260605233837.1773732-1-acme@kernel.org \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=tglx@linutronix.de \
--cc=williams@redhat.com \
/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