Re: [PATCH] perf header: Validate build_id filename length to prevent buffer overflow
From: Ian Rogers
Date: Wed Apr 01 2026 - 16:48:56 EST
On Fri, Feb 6, 2026 at 12:37 AM SeungJu Cheon <suunj1331@xxxxxxxxx> wrote:
>
> The build_id parsing functions calculate a filename length from the
> event header size and read directly into a stack buffer of PATH_MAX
> bytes without bounds checking. A malformed perf.data file with a
> crafted header.size can cause the length to be negative or exceed
> PATH_MAX, resulting in a stack buffer overflow.
>
> Add bounds checking for the filename length in both
> perf_header__read_build_ids() and the ABI quirk variant.
Lgtm, could we print errors when these conditions occur?
Thanks,
Ian
> Signed-off-by: SeungJu Cheon <suunj1331@xxxxxxxxx>
> ---
> tools/perf/util/header.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index f5cad377c99e..208ccaa62399 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -2335,6 +2335,9 @@ static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
> perf_event_header__bswap(&old_bev.header);
>
> len = old_bev.header.size - sizeof(old_bev);
> + if (len < 0 || len >= PATH_MAX)
> + return -1;
> +
> if (readn(input, filename, len) != len)
> return -1;
>
> @@ -2377,6 +2380,9 @@ static int perf_header__read_build_ids(struct perf_header *header,
> perf_event_header__bswap(&bev.header);
>
> len = bev.header.size - sizeof(bev);
> + if (len < 0 || len >= PATH_MAX)
> + goto out;
> +
> if (readn(input, filename, len) != len)
> goto out;
> /*
> --
> 2.52.0
>