diff options
Diffstat (limited to 'tools/perf/util/session.c')
| -rw-r--r-- | tools/perf/util/session.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 3b8dfe603e50..45a30040ec8d 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2095,6 +2095,7 @@ prefetch_event(char *buf, u64 head, size_t mmap_size,  	       bool needs_swap, union perf_event *error)  {  	union perf_event *event; +	u16 event_size;  	/*  	 * Ensure we have enough space remaining to read @@ -2107,15 +2108,23 @@ prefetch_event(char *buf, u64 head, size_t mmap_size,  	if (needs_swap)  		perf_event_header__bswap(&event->header); -	if (head + event->header.size <= mmap_size) +	event_size = event->header.size; +	if (head + event_size <= mmap_size)  		return event;  	/* We're not fetching the event so swap back again */  	if (needs_swap)  		perf_event_header__bswap(&event->header); -	pr_debug("%s: head=%#" PRIx64 " event->header_size=%#x, mmap_size=%#zx:" -		 " fuzzed or compressed perf.data?\n",__func__, head, event->header.size, mmap_size); +	/* Check if the event fits into the next mmapped buf. */ +	if (event_size <= mmap_size - head % page_size) { +		/* Remap buf and fetch again. */ +		return NULL; +	} + +	/* Invalid input. Event size should never exceed mmap_size. */ +	pr_debug("%s: head=%#" PRIx64 " event->header.size=%#x, mmap_size=%#zx:" +		 " fuzzed or compressed perf.data?\n", __func__, head, event_size, mmap_size);  	return error;  }  | 
