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>
This commit is contained in:
		
					parent
					
						
							
								7f42b9505a
							
						
					
				
			
			
				commit
				
					
						3dce2ce3cc
					
				
			
		
					 2 changed files with 31 additions and 19 deletions
				
			
		|  | @ -1670,8 +1670,8 @@ static int process_tracing_data(struct perf_file_section *section __maybe_unused | |||
| 				struct perf_header *ph __maybe_unused, | ||||
| 				int fd, void *data) | ||||
| { | ||||
| 	trace_report(fd, data, false); | ||||
| 	return 0; | ||||
| 	ssize_t ret = trace_report(fd, data, false); | ||||
| 	return ret < 0 ? -1 : 0; | ||||
| } | ||||
| 
 | ||||
| static int process_build_id(struct perf_file_section *section, | ||||
|  | @ -2750,6 +2750,11 @@ static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel, | |||
| 	if (evsel->tp_format) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (pevent == NULL) { | ||||
| 		pr_debug("broken or missing trace data\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	event = pevent_find_event(pevent, evsel->attr.config); | ||||
| 	if (event == NULL) | ||||
| 		return -1; | ||||
|  |  | |||
|  | @ -291,7 +291,10 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |||
| 	int show_version = 0; | ||||
| 	int show_funcs = 0; | ||||
| 	int show_printk = 0; | ||||
| 	ssize_t size; | ||||
| 	ssize_t size = -1; | ||||
| 	struct pevent *pevent; | ||||
| 
 | ||||
| 	*ppevent = NULL; | ||||
| 
 | ||||
| 	calc_data_size = 1; | ||||
| 	repipe = __repipe; | ||||
|  | @ -315,34 +318,38 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) | |||
| 	file_bigendian = buf[0]; | ||||
| 	host_bigendian = bigendian(); | ||||
| 
 | ||||
| 	*ppevent = read_trace_init(file_bigendian, host_bigendian); | ||||
| 	if (*ppevent == NULL) | ||||
| 		die("read_trace_init failed"); | ||||
| 	pevent = read_trace_init(file_bigendian, host_bigendian); | ||||
| 	if (pevent == NULL) { | ||||
| 		pr_debug("read_trace_init failed"); | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	read_or_die(buf, 1); | ||||
| 	long_size = buf[0]; | ||||
| 
 | ||||
| 	page_size = read4(*ppevent); | ||||
| 	page_size = read4(pevent); | ||||
| 
 | ||||
| 	read_header_files(*ppevent); | ||||
| 
 | ||||
| 	read_ftrace_files(*ppevent); | ||||
| 	read_event_files(*ppevent); | ||||
| 	read_proc_kallsyms(*ppevent); | ||||
| 	read_ftrace_printk(*ppevent); | ||||
| 	read_header_files(pevent); | ||||
| 	read_ftrace_files(pevent); | ||||
| 	read_event_files(pevent); | ||||
| 	read_proc_kallsyms(pevent); | ||||
| 	read_ftrace_printk(pevent); | ||||
| 
 | ||||
| 	size = calc_data_size - 1; | ||||
| 	calc_data_size = 0; | ||||
| 	repipe = false; | ||||
| 
 | ||||
| 	if (show_funcs) { | ||||
| 		pevent_print_funcs(*ppevent); | ||||
| 		return size; | ||||
| 	} | ||||
| 	if (show_printk) { | ||||
| 		pevent_print_printk(*ppevent); | ||||
| 		return size; | ||||
| 		pevent_print_funcs(pevent); | ||||
| 	} else if (show_printk) { | ||||
| 		pevent_print_printk(pevent); | ||||
| 	} | ||||
| 
 | ||||
| 	*ppevent = pevent; | ||||
| 	pevent = NULL; | ||||
| 
 | ||||
| out: | ||||
| 	if (pevent) | ||||
| 		pevent_free(pevent); | ||||
| 	return size; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Namhyung Kim
				Namhyung Kim