diff options
author | Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> | 2009-12-06 23:06:29 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-07 00:26:24 -0500 |
commit | d8bd9e0aedabcb47887712497bc386a06ddcbd12 (patch) | |
tree | b8fbdb8987323a3b572554ebe00487d444abfec4 /tools/perf/builtin-kmem.c | |
parent | c0777c5aa835a97ccc77d82e55388940f0140a61 (diff) |
perf_event: Fix raw event processing
We use 'data.raw_data' parameter to call process_raw_event(),
but data.raw_data buffer not include data size. it can make perf
tool crash.
This bug was introduced by commit 180f95e29a ("perf: Make common
SAMPLE_EVENT parser").
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Li Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <4B1C7F45.5080105@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/builtin-kmem.c')
-rw-r--r-- | tools/perf/builtin-kmem.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index f218990de0cd..f84d7a3db681 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -289,13 +289,17 @@ static void process_free_event(struct raw_event_sample *raw, | |||
289 | } | 289 | } |
290 | 290 | ||
291 | static void | 291 | static void |
292 | process_raw_event(event_t *raw_event __used, void *more_data, | 292 | process_raw_event(event_t *raw_event __used, u32 size, void *data, |
293 | int cpu, u64 timestamp, struct thread *thread) | 293 | int cpu, u64 timestamp, struct thread *thread) |
294 | { | 294 | { |
295 | struct raw_event_sample *raw = more_data; | 295 | struct raw_event_sample *raw; |
296 | struct event *event; | 296 | struct event *event; |
297 | int type; | 297 | int type; |
298 | 298 | ||
299 | raw = malloc_or_die(sizeof(*raw)+size); | ||
300 | raw->size = size; | ||
301 | memcpy(raw->data, data, size); | ||
302 | |||
299 | type = trace_parse_common_type(raw->data); | 303 | type = trace_parse_common_type(raw->data); |
300 | event = trace_find_event(type); | 304 | event = trace_find_event(type); |
301 | 305 | ||
@@ -345,7 +349,8 @@ static int process_sample_event(event_t *event) | |||
345 | 349 | ||
346 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 350 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
347 | 351 | ||
348 | process_raw_event(event, data.raw_data, data.cpu, data.time, thread); | 352 | process_raw_event(event, data.raw_size, data.raw_data, data.cpu, |
353 | data.time, thread); | ||
349 | 354 | ||
350 | return 0; | 355 | return 0; |
351 | } | 356 | } |