Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 248590
b: refs/heads/master
c: 98e1da9
h: refs/heads/master
v: v3
  • Loading branch information
Frederic Weisbecker committed May 22, 2011
1 parent b73a9ba commit 09bc9ca
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a285412479b6d5af3e48273a92ec2f1987df8cd1
refs/heads/master: 98e1da905cbe64bb023a165c7c01eef5e800609e
26 changes: 26 additions & 0 deletions trunk/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 09bc9ca

Please sign in to comment.