Skip to content

Commit

Permalink
perf tools: Robustify dynamic sample content fetch
Browse files Browse the repository at this point in the history
Ensure the size of the dynamic fields such as callchains
or raw events don't overlap the whole event boundaries.

This prevents from dereferencing junk if the given size of
the callchain goes too eager.

Reported-by: Linus Torvalds <[email protected]>
Reported-by: Ingo Molnar <[email protected]>
Signed-off-by: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: Stephane Eranian <[email protected]>
  • Loading branch information
fweisbec committed May 22, 2011
1 parent a285412 commit 98e1da9
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions tools/perf/util/evsel.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,17 @@ static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
return 0;
}

static bool sample_overlap(const union perf_event *event,
const void *offset, u64 size)
{
const void *base = event;

if (offset + size > base + event->header.size)
return true;

return false;
}

int perf_event__parse_sample(const union perf_event *event, u64 type,
int sample_size, bool sample_id_all,
struct perf_sample *data)
Expand Down Expand Up @@ -373,14 +384,29 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
}

if (type & PERF_SAMPLE_CALLCHAIN) {
if (sample_overlap(event, array, sizeof(data->callchain->nr)))
return -EFAULT;

data->callchain = (struct ip_callchain *)array;

if (sample_overlap(event, array, data->callchain->nr))
return -EFAULT;

array += 1 + data->callchain->nr;
}

if (type & PERF_SAMPLE_RAW) {
u32 *p = (u32 *)array;

if (sample_overlap(event, array, sizeof(u32)))
return -EFAULT;

data->raw_size = *p;
p++;

if (sample_overlap(event, p, data->raw_size))
return -EFAULT;

data->raw_data = p;
}

Expand Down

0 comments on commit 98e1da9

Please sign in to comment.