diff options
| author | Namhyung Kim <namhyung.kim@lge.com> | 2012-09-07 11:49:45 +0900 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-09-07 12:14:30 -0300 | 
| commit | 245c5a18433090da0e1a799bdb0faa78552b5992 (patch) | |
| tree | 96dcb05214f91cb66cfde7a07ba0f8a561a598c5 /tools/lib | |
| parent | 9a2936878a198553a17d21d1e843aa574ad9fa38 (diff) | |
| download | linux-245c5a18433090da0e1a799bdb0faa78552b5992.tar.bz2 | |
tools lib traceevent: Get rid of die() from pretty_print()
There are three cases that call die() in the pretty_print.
 1. insufficient number of argument: cannot proceed anymore.
 2. too long format conversion specifier: truncate and proceed.
 3. bad size specifier in format string: skip and proceed.
For all cases, convert die to do_warning, mark the event as
EVENT_FL_FAILED and print error message at the last.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1346986187-5170-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib')
| -rw-r--r-- | tools/lib/traceevent/event-parse.c | 43 | 
1 files changed, 32 insertions, 11 deletions
| diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index b5b4d806ffa2..6d5e75987a3d 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -3889,8 +3889,11 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event  				goto cont_process;  			case '*':  				/* The argument is the length. */ -				if (!arg) -					die("no argument match"); +				if (!arg) { +					do_warning("no argument match"); +					event->flags |= EVENT_FL_FAILED; +					goto out_failed; +				}  				len_arg = eval_num_arg(data, size, event, arg);  				len_as_arg = 1;  				arg = arg->next; @@ -3923,15 +3926,21 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event  			case 'x':  			case 'X':  			case 'u': -				if (!arg) -					die("no argument match"); +				if (!arg) { +					do_warning("no argument match"); +					event->flags |= EVENT_FL_FAILED; +					goto out_failed; +				}  				len = ((unsigned long)ptr + 1) -  					(unsigned long)saveptr;  				/* should never happen */ -				if (len > 31) -					die("bad format!"); +				if (len > 31) { +					do_warning("bad format!"); +					event->flags |= EVENT_FL_FAILED; +					len = 31; +				}  				memcpy(format, saveptr, len);  				format[len] = 0; @@ -3995,19 +4004,26 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event  						trace_seq_printf(s, format, (long long)val);  					break;  				default: -					die("bad count (%d)", ls); +					do_warning("bad count (%d)", ls); +					event->flags |= EVENT_FL_FAILED;  				}  				break;  			case 's': -				if (!arg) -					die("no matching argument"); +				if (!arg) { +					do_warning("no matching argument"); +					event->flags |= EVENT_FL_FAILED; +					goto out_failed; +				}  				len = ((unsigned long)ptr + 1) -  					(unsigned long)saveptr;  				/* should never happen */ -				if (len > 31) -					die("bad format!"); +				if (len > 31) { +					do_warning("bad format!"); +					event->flags |= EVENT_FL_FAILED; +					len = 31; +				}  				memcpy(format, saveptr, len);  				format[len] = 0; @@ -4025,6 +4041,11 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event  			trace_seq_putc(s, *ptr);  	} +	if (event->flags & EVENT_FL_FAILED) { +out_failed: +		trace_seq_printf(s, "[FAILED TO PARSE]"); +	} +  	if (args) {  		free_args(args);  		free(bprint_fmt); |