Re: [PATCH v7 03/23] perf evsel: Refactor evsel tracepoint sample accessors perf_sample

Namhyung Kim <[email protected]>
Newsgroups dev.linux.lists.sashiko,org.kernel.vger.linux-perf-users
Message-ID <[email protected]>
On Wed, Apr 08, 2026 at 08:20:22AM +0000, [email protected] wrote:
> Sashiko AI review found 1 potential issue(s):
> - [Medium] Integer overflow and incomplete validation in the newly added tracepoint bounds checks allow out-of-bounds memory accesses.
> --
> 
> commit f7dda507e65d40381a27ba2e39e45e8a6050afff
> Author: Ian Rogers <[email protected]>
> 
> perf evsel: Refactor evsel tracepoint sample accessors perf_sample
> 
> This commit refactors tracepoint sample accessors to remove the evsel
> argument. It also adds bounds checks when reading values from tracepoint
> fields based on review feedback.
> 
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index 2ee87fd84d3ea..b653e683d7a12 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -3687,15 +3687,20 @@ struct tep_format_field *evsel__common_field(struct evsel *evsel, const char *na
> >  	return tp_format ? tep_find_common_field(tp_format, name) : NULL;
> >  }
> >  
> > -void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name)
> > +void *perf_sample__rawptr(struct perf_sample *sample, const char *name)
> >  {
> > -	struct tep_format_field *field = evsel__field(evsel, name);
> > +	struct tep_format_field *field = evsel__field(sample->evsel, name);
> >  	int offset;
> >  
> >  	if (!field)
> >  		return NULL;
> >  
> >  	offset = field->offset;
> > +	if ((u32)(offset + field->size) > sample->raw_size) {
> > +		pr_warning("Invalid trace point field offset %d for field of length %d in sample raw data of size %u\n",
> > +			   offset, field->size, sample->raw_size);
> > +		return NULL;
> > +	}
> 
> Can this bounds check be bypassed due to integer overflow? If a malformed
> perf.data file provides an exceptionally large offset (for example,
> 0xFFFFFFFC) and a size of 4, the sum could wrap around to 0. Would this
> allow an out-of-bounds read when accessing the memory?

I think it's better not to include any bounds check in the patch.
It's adding a lot of review noise and doesn't help making progress.
You can ignore security issues in this series as they are pre-existing,
and just make this patch simple, doing one thing - removing 'evsel'
argument.

The review comments can be addressed in a separate patch series
(preferrably) or different patches in this series.

Thanks,
Namhyung

> 
> >  	if (field->flags & TEP_FIELD_IS_DYNAMIC) {
> >  		offset = *(int *)(sample->raw_data + field->offset);
> >  		offset &= 0xffff;
> >  		if (tep_field_is_relative(field->flags))
> >  			offset += field->offset + field->size;
> >  	}
> > 
> >  	return sample->raw_data + offset;
> 
> Is the dynamically computed offset validated against sample->raw_size? It
> appears the initial check covers the initial field offset, but the newly
> computed offset for dynamic fields is added directly to sample->raw_data
> without a subsequent bounds check, which might lead to out-of-bounds memory
> accesses.
> 
> [ ... ]
> 
> > @@ -3713,6 +3718,12 @@ u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sam
> >  	u64 value;
> >  	void *ptr = sample->raw_data + field->offset;
> >  
> > +	if ((u32)(field->offset + field->size) > sample->raw_size) {
> > +		pr_warning("Invalid trace point field offset %d for field of length %d in sample raw data of size %u\n",
> > +			   field->offset, field->size, sample->raw_size);
> > +		return 0;
> > +	}
> > +
> 
> Can this suffer from the same integer overflow issue? If field->offset and
> field->size wrap around when added together, it looks like an out-of-bounds
> pointer could be dereferenced when evaluating the field.
> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.