[PATCH v4 0/5] perf trace-event: Fix overflow, loop and cleanup bugs
From: Tanushree Shah <hidden>
Date: 2026-07-25 19:17:41
Also in:
linux-perf-users
This series fixes five security issues in trace-event-read.c and
trace-event.c:
1. Stack buffer overflow in read_string() when a string exceeds
BUFSIZ, due to a missing bounds check.
2. Integer truncation when passing 64-bit sizes into do_read() and
skip(), which use 'int' parameters, causing uninitialized memory
to be dumped and parsers to read out of bounds.
3. Double free / use-after-free in trace_event__cleanup(): it frees
t->pevent but never clears the pointer, so calling it twice on
the same trace_event touches already-freed memory. Also fixes a
related leak in trace_event__init(), which overwrites
t->pevent/t->plugin_list without releasing any existing handle
if called more than once on the same struct.
4. Heap buffer overflow in read_ftrace_printk() and
read_saved_cmdline(): size + 1 can overflow to 0 in malloc(),
allocating a tiny buffer while a huge read is still attempted
into it.
5. Infinite loop in skip(): it does not check do_read()'s return
value, so a crafted size can spin the loop indefinitely.
Patches 4 and 5 are latent bugs that patch 2's type fix exposes by
removing accidental truncation that had been masking them.
Tanushree Shah (5):
perf trace-event: Fix buffer overflow in read_string()
perf trace-event: Fix integer truncation in do_read() and skip()
perf trace-event: Avoid double free and leak in
trace_event__cleanup()/trace_event__init()
perf trace-event: Fix heap overflows in
read_ftrace_printk()/read_saved_cmdline()
perf trace-event: Fix infinite loop in skip()
tools/perf/util/trace-event-read.c | 54 ++++++++++++++++++++----------
tools/perf/util/trace-event.c | 11 +++++-
2 files changed, 47 insertions(+), 18 deletions(-)
---
Changes in v4:
- Fixed a leak in trace_event__init(): repeated calls overwrite
t->pevent/t->plugin_list without releasing the existing handle.
- Fixed the same size + 1 overflow in read_saved_cmdline() as
read_ftrace_printk() (size == ULLONG_MAX wraps to 0 in malloc()).
- Added <limits.h> for the UINT_MAX/ULLONG_MAX checks.
Changes in v3:
- Added new patch to fix double free in trace_event__cleanup().
- Added new patch to fix heap buffer overflow in read_ftrace_printk().
- Added new patch to fix infinite loop in skip().
Changes in v2:
- Added new patch to fix integer truncation in do_read() and skip().
- Organized as patch series to separate the two security fixes.
v1: https://lore.kernel.org/linux-perf-users/20260722113552.191143-3-tshah@linux.ibm.com/ (local)
--
2.47.3