aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung.kim@lge.com>2013-03-21 03:18:48 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-03-21 12:30:52 -0400
commit3dce2ce3cc40ece2562a5a83e879b4bfb451476c (patch)
treeb066d350c037448be3e4b33866caea190f4f00be /tools/perf/util
parent7f42b9505aee3fa9cb465a670989e3d426a1f3f2 (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')
-rw-r--r--tools/perf/util/header.c9
-rw-r--r--tools/perf/util/trace-event-read.c41
2 files changed, 31 insertions, 19 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 79e48c726938..326068a593a5 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1670,8 +1670,8 @@ static int process_tracing_data(struct perf_file_section *section __maybe_unused
1670 struct perf_header *ph __maybe_unused, 1670 struct perf_header *ph __maybe_unused,
1671 int fd, void *data) 1671 int fd, void *data)
1672{ 1672{
1673 trace_report(fd, data, false); 1673 ssize_t ret = trace_report(fd, data, false);
1674 return 0; 1674 return ret < 0 ? -1 : 0;
1675} 1675}
1676 1676
1677static int process_build_id(struct perf_file_section *section, 1677static int process_build_id(struct perf_file_section *section,
@@ -2750,6 +2750,11 @@ static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel,
2750 if (evsel->tp_format) 2750 if (evsel->tp_format)
2751 return 0; 2751 return 0;
2752 2752
2753 if (pevent == NULL) {
2754 pr_debug("broken or missing trace data\n");
2755 return -1;
2756 }
2757
2753 event = pevent_find_event(pevent, evsel->attr.config); 2758 event = pevent_find_event(pevent, evsel->attr.config);
2754 if (event == NULL) 2759 if (event == NULL)
2755 return -1; 2760 return -1;
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
351out:
352 if (pevent)
353 pevent_free(pevent);
347 return size; 354 return size;
348} 355}