Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bad76008 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

perf_counter tools: fix infinite loop in perf-report on zeroed event records



Bail out early if a record has zero size - we have no chance to make
reliable progress in that case. Print out the offset where this happens,
and print the number of bytes we missed out on.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 66cf7829
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include <ctype.h>
#include <time.h>
#include <getopt.h>
#include <assert.h>

#include <sys/ioctl.h>
#include <sys/poll.h>
@@ -226,7 +227,7 @@ void load_kallsyms(void)
	while (!feof(file)) {
		uint64_t start;
		char c;
		char sym[1024];
		char sym[1024000];

		if (getline(&line, &n, file) < 0)
			break;
@@ -416,12 +417,23 @@ more:

	if (head + event->header.size >= page_size * mmap_window) {
		unsigned long shift = page_size * (head / page_size);
		int ret;

		ret = munmap(buf, page_size * mmap_window);
		assert(ret == 0);

		munmap(buf, page_size * mmap_window);
		offset += shift;
		head -= shift;
		goto remap;
	}


	if (!event->header.size) {
		fprintf(stderr, "zero-sized event at file offset %ld\n", offset + head);
		fprintf(stderr, "skipping %ld bytes of events.\n", stat.st_size - offset - head);
		goto done;
	}

	head += event->header.size;

	if (event->header.misc & PERF_EVENT_MISC_OVERFLOW) {
@@ -458,6 +470,8 @@ more:
	if (offset + head < stat.st_size)
		goto more;

done:

	close(input);

	std::map<std::string, int>::iterator hi = hist.begin();