diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/trace.h | 10 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 6 | ||||
| -rw-r--r-- | kernel/trace/trace_probe.c | 16 | 
3 files changed, 25 insertions, 7 deletions
| diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 26b0a08f3c7d..f801d154ff6a 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -365,11 +365,11 @@ static inline struct trace_array *top_trace_array(void)  	__builtin_types_compatible_p(typeof(var), type *)  #undef IF_ASSIGN -#define IF_ASSIGN(var, entry, etype, id)		\ -	if (FTRACE_CMP_TYPE(var, etype)) {		\ -		var = (typeof(var))(entry);		\ -		WARN_ON(id && (entry)->type != id);	\ -		break;					\ +#define IF_ASSIGN(var, entry, etype, id)			\ +	if (FTRACE_CMP_TYPE(var, etype)) {			\ +		var = (typeof(var))(entry);			\ +		WARN_ON(id != 0 && (entry)->type != id);	\ +		break;						\  	}  /* Will cause compile errors if type is not found. */ diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index c773b8fb270c..c9a74f82b14a 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -452,8 +452,10 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,  		switch (*next) {  		case '(':					/* #2 */ -			if (top - op_stack > nr_parens) -				return ERR_PTR(-EINVAL); +			if (top - op_stack > nr_parens) { +				ret = -EINVAL; +				goto out_free; +			}  			*(++top) = invert;  			continue;  		case '!':					/* #3 */ diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c index baf58a3612c0..905b10af5d5c 100644 --- a/kernel/trace/trace_probe.c +++ b/kernel/trace/trace_probe.c @@ -178,6 +178,16 @@ void __trace_probe_log_err(int offset, int err_type)  	if (!command)  		return; +	if (trace_probe_log.index >= trace_probe_log.argc) { +		/** +		 * Set the error position is next to the last arg + space. +		 * Note that len includes the terminal null and the cursor +		 * appaers at pos + 1. +		 */ +		pos = len; +		offset = 0; +	} +  	/* And make a command string from argv array */  	p = command;  	for (i = 0; i < trace_probe_log.argc; i++) { @@ -1084,6 +1094,12 @@ int trace_probe_compare_arg_type(struct trace_probe *a, struct trace_probe *b)  {  	int i; +	/* In case of more arguments */ +	if (a->nr_args < b->nr_args) +		return a->nr_args + 1; +	if (a->nr_args > b->nr_args) +		return b->nr_args + 1; +  	for (i = 0; i < a->nr_args; i++) {  		if ((b->nr_args <= i) ||  		    ((a->args[i].type != b->args[i].type) || | 

