提交 27389d78 编写于 作者: A Adrian Hunter 提交者: Arnaldo Carvalho de Melo

perf tools: Validate perf event header size

The 'size' variable includes the header so must be at least
'sizeof(struct perf_event_header)'.  Error out immediately if that is
not the case.  Also don't byte-swap the header until it is actually
"fetched" from the mmap region.
Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1372944040-32690-9-git-send-email-adrian.hunter@intel.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 93edcbd9
...@@ -1094,8 +1094,10 @@ static int __perf_session__process_pipe_events(struct perf_session *self, ...@@ -1094,8 +1094,10 @@ static int __perf_session__process_pipe_events(struct perf_session *self,
perf_event_header__bswap(&event->header); perf_event_header__bswap(&event->header);
size = event->header.size; size = event->header.size;
if (size == 0) if (size < sizeof(struct perf_event_header)) {
size = 8; pr_err("bad event header size\n");
goto out_err;
}
if (size > cur_size) { if (size > cur_size) {
void *new = realloc(buf, size); void *new = realloc(buf, size);
...@@ -1164,8 +1166,12 @@ fetch_mmaped_event(struct perf_session *session, ...@@ -1164,8 +1166,12 @@ fetch_mmaped_event(struct perf_session *session,
if (session->header.needs_swap) if (session->header.needs_swap)
perf_event_header__bswap(&event->header); perf_event_header__bswap(&event->header);
if (head + event->header.size > mmap_size) if (head + event->header.size > mmap_size) {
/* We're not fetching the event so swap back again */
if (session->header.needs_swap)
perf_event_header__bswap(&event->header);
return NULL; return NULL;
}
return event; return event;
} }
...@@ -1245,7 +1251,7 @@ int __perf_session__process_events(struct perf_session *session, ...@@ -1245,7 +1251,7 @@ int __perf_session__process_events(struct perf_session *session,
size = event->header.size; size = event->header.size;
if (size == 0 || if (size < sizeof(struct perf_event_header) ||
perf_session__process_event(session, event, tool, file_pos) < 0) { perf_session__process_event(session, event, tool, file_pos) < 0) {
pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
file_offset + head, event->header.size, file_offset + head, event->header.size,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册