diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2013-03-21 03:18:48 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-03-21 12:30:52 -0400 |
commit | 3dce2ce3cc40ece2562a5a83e879b4bfb451476c (patch) | |
tree | b066d350c037448be3e4b33866caea190f4f00be /tools/perf/util/trace-event-read.c | |
parent | 7f42b9505aee3fa9cb465a670989e3d426a1f3f2 (diff) |
perf tools: Handle failure case in trace_report()
If pevent allocation in read_trace_init() fails, trace_report() will
return -1 and *ppevent is set to NULL. Its callers should check this
case and handle it properly.
This is also a preparation for the removal of *die() calls.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1363850332-25297-6-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/trace-event-read.c')
-rw-r--r-- | tools/perf/util/trace-event-read.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c index 8c8181aa286a..ba752d765ac3 100644 --- a/tools/perf/util/trace-event-read.c +++ b/tools/perf/util/trace-event-read.c | |||
@@ -291,7 +291,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |||
291 | int show_version = 0; | 291 | int show_version = 0; |
292 | int show_funcs = 0; | 292 | int show_funcs = 0; |
293 | int show_printk = 0; | 293 | int show_printk = 0; |
294 | ssize_t size; | 294 | ssize_t size = -1; |
295 | struct pevent *pevent; | ||
296 | |||
297 | *ppevent = NULL; | ||
295 | 298 | ||
296 | calc_data_size = 1; | 299 | calc_data_size = 1; |
297 | repipe = __repipe; | 300 | repipe = __repipe; |
@@ -315,34 +318,38 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |||
315 | file_bigendian = buf[0]; | 318 | file_bigendian = buf[0]; |
316 | host_bigendian = bigendian(); | 319 | host_bigendian = bigendian(); |
317 | 320 | ||
318 | *ppevent = read_trace_init(file_bigendian, host_bigendian); | 321 | pevent = read_trace_init(file_bigendian, host_bigendian); |
319 | if (*ppevent == NULL) | 322 | if (pevent == NULL) { |
320 | die("read_trace_init failed"); | 323 | pr_debug("read_trace_init failed"); |
324 | goto out; | ||
325 | } | ||
321 | 326 | ||
322 | read_or_die(buf, 1); | 327 | read_or_die(buf, 1); |
323 | long_size = buf[0]; | 328 | long_size = buf[0]; |
324 | 329 | ||
325 | page_size = read4(*ppevent); | 330 | page_size = read4(pevent); |
326 | |||
327 | read_header_files(*ppevent); | ||
328 | 331 | ||
329 | read_ftrace_files(*ppevent); | 332 | read_header_files(pevent); |
330 | read_event_files(*ppevent); | 333 | read_ftrace_files(pevent); |
331 | read_proc_kallsyms(*ppevent); | 334 | read_event_files(pevent); |
332 | read_ftrace_printk(*ppevent); | 335 | read_proc_kallsyms(pevent); |
336 | read_ftrace_printk(pevent); | ||
333 | 337 | ||
334 | size = calc_data_size - 1; | 338 | size = calc_data_size - 1; |
335 | calc_data_size = 0; | 339 | calc_data_size = 0; |
336 | repipe = false; | 340 | repipe = false; |
337 | 341 | ||
338 | if (show_funcs) { | 342 | if (show_funcs) { |
339 | pevent_print_funcs(*ppevent); | 343 | pevent_print_funcs(pevent); |
340 | return size; | 344 | } else if (show_printk) { |
341 | } | 345 | pevent_print_printk(pevent); |
342 | if (show_printk) { | ||
343 | pevent_print_printk(*ppevent); | ||
344 | return size; | ||
345 | } | 346 | } |
346 | 347 | ||
348 | *ppevent = pevent; | ||
349 | pevent = NULL; | ||
350 | |||
351 | out: | ||
352 | if (pevent) | ||
353 | pevent_free(pevent); | ||
347 | return size; | 354 | return size; |
348 | } | 355 | } |