diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/ftrace.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 5 | ||||
| -rw-r--r-- | kernel/trace/trace_events_trigger.c | 6 | 
3 files changed, 9 insertions, 3 deletions
| diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 77734451cb05..e23eb9fc77aa 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -5460,6 +5460,7 @@ void ftrace_destroy_filter_files(struct ftrace_ops *ops)  	if (ops->flags & FTRACE_OPS_FL_ENABLED)  		ftrace_shutdown(ops, 0);  	ops->flags |= FTRACE_OPS_FL_DELETED; +	ftrace_free_filter(ops);  	mutex_unlock(&ftrace_lock);  } diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 84a65173b1e9..5574e862de8d 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c @@ -570,11 +570,13 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,  		}  	} +	kfree(op_stack); +	kfree(inverts);  	return prog;  out_free:  	kfree(op_stack); -	kfree(prog_stack);  	kfree(inverts); +	kfree(prog_stack);  	return ERR_PTR(ret);  } @@ -1718,6 +1720,7 @@ static int create_filter(struct trace_event_call *call,  	err = process_preds(call, filter_string, *filterp, pe);  	if (err && set_str)  		append_filter_err(pe, *filterp); +	create_filter_finish(pe);  	return err;  } diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index 2152d1e530cb..cd12ecb66eb9 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -732,8 +732,10 @@ int set_trigger_filter(char *filter_str,  	/* The filter is for the 'trigger' event, not the triggered event */  	ret = create_event_filter(file->event_call, filter_str, false, &filter); -	if (ret) -		goto out; +	/* +	 * If create_event_filter() fails, filter still needs to be freed. +	 * Which the calling code will do with data->filter. +	 */   assign:  	tmp = rcu_access_pointer(data->filter); | 
