diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2011-05-21 13:33:04 -0400 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2011-05-21 21:38:36 -0400 |
commit | a285412479b6d5af3e48273a92ec2f1987df8cd1 (patch) | |
tree | 29f68684cebb26b86c3dd0b0f0fc4e5d6553c989 /tools/perf/util/event.h | |
parent | 74429964d8e29c0107fa6e9cdf35b8f33f57405d (diff) |
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>
Diffstat (limited to 'tools/perf/util/event.h')
-rw-r--r-- | tools/perf/util/event.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 9c35170fb379..c08332871408 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
@@ -56,6 +56,13 @@ struct read_event { | |||
56 | u64 id; | 56 | u64 id; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | |||
60 | #define PERF_SAMPLE_MASK \ | ||
61 | (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ | ||
62 | PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \ | ||
63 | PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID | \ | ||
64 | PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) | ||
65 | |||
59 | struct sample_event { | 66 | struct sample_event { |
60 | struct perf_event_header header; | 67 | struct perf_event_header header; |
61 | u64 array[]; | 68 | u64 array[]; |
@@ -75,6 +82,8 @@ struct perf_sample { | |||
75 | struct ip_callchain *callchain; | 82 | struct ip_callchain *callchain; |
76 | }; | 83 | }; |
77 | 84 | ||
85 | int perf_sample_size(u64 sample_type); | ||
86 | |||
78 | #define BUILD_ID_SIZE 20 | 87 | #define BUILD_ID_SIZE 20 |
79 | 88 | ||
80 | struct build_id_event { | 89 | struct build_id_event { |
@@ -178,6 +187,7 @@ int perf_event__preprocess_sample(const union perf_event *self, | |||
178 | const char *perf_event__name(unsigned int id); | 187 | const char *perf_event__name(unsigned int id); |
179 | 188 | ||
180 | int perf_event__parse_sample(const union perf_event *event, u64 type, | 189 | int perf_event__parse_sample(const union perf_event *event, u64 type, |
181 | bool sample_id_all, struct perf_sample *sample); | 190 | int sample_size, bool sample_id_all, |
191 | struct perf_sample *sample); | ||
182 | 192 | ||
183 | #endif /* __PERF_RECORD_H */ | 193 | #endif /* __PERF_RECORD_H */ |