perf tools: Pre-check sample size before parsing

Check that the total size of the sample fields having a fixed
size do not exceed the one of the whole event. This robustifies
the sample parsing.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Stephane Eranian <eranian@google.com>
This commit is contained in:
Frederic Weisbecker
2011-05-21 19:33:04 +02:00
parent 74429964d8
commit a285412479
7 changed files with 41 additions and 5 deletions

View File

@ -56,6 +56,13 @@ struct read_event {
u64 id;
};
#define PERF_SAMPLE_MASK \
(PERF_SAMPLE_IP | PERF_SAMPLE_TID | \
PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \
PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \
PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
struct sample_event {
struct perf_event_header header;
u64 array[];
@ -75,6 +82,8 @@ struct perf_sample {
struct ip_callchain *callchain;
};
int perf_sample_size(u64 sample_type);
#define BUILD_ID_SIZE 20
struct build_id_event {
@ -178,6 +187,7 @@ int perf_event__preprocess_sample(const union perf_event *self,
const char *perf_event__name(unsigned int id);
int perf_event__parse_sample(const union perf_event *event, u64 type,
bool sample_id_all, struct perf_sample *sample);
int sample_size, bool sample_id_all,
struct perf_sample *sample);
#endif /* __PERF_RECORD_H */