diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-07-27 19:50:33 +0300 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-07-27 19:50:33 +0300 | 
| commit | 3ebb6fb03dad87cfd74d5bcd31b9dbcf3c82c89c (patch) | |
| tree | 6ed7e28d6cb3f6e935c0abcfa9dcbec5d28dd5f2 /kernel/trace/trace_events_trigger.c | |
| parent | f636d300cdd6c5ff30662feb2149640eee85679a (diff) | |
| parent | 3e536e222f2930534c252c1cc7ae799c725c5ff9 (diff) | |
| download | linux-3ebb6fb03dad87cfd74d5bcd31b9dbcf3c82c89c.tar.xz | |
Merge tag 'trace-v4.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing fixes from Steven Rostedt:
 "Various fixes to the tracing infrastructure:
   - Fix double free when the reg() call fails in
     event_trigger_callback()
   - Fix anomoly of snapshot causing tracing_on flag to change
   - Add selftest to test snapshot and tracing_on affecting each other
   - Fix setting of tracepoint flag on error that prevents probes from
     being deleted.
   - Fix another possible double free that is similar to
     event_trigger_callback()
   - Quiet a gcc warning of a false positive unused variable
   - Fix crash of partial exposed task->comm to trace events"
* tag 'trace-v4.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  kthread, tracing: Don't expose half-written comm when creating kthreads
  tracing: Quiet gcc warning about maybe unused link variable
  tracing: Fix possible double free in event_enable_trigger_func()
  tracing/kprobes: Fix trace_probe flags on enable_trace_kprobe() failure
  selftests/ftrace: Add snapshot and tracing_on test case
  ring_buffer: tracing: Inherit the tracing setting to next ring buffer
  tracing: Fix double free of event_trigger_data
Diffstat (limited to 'kernel/trace/trace_events_trigger.c')
| -rw-r--r-- | kernel/trace/trace_events_trigger.c | 18 | 
1 files changed, 13 insertions, 5 deletions
| diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index d18249683682..5dea177cef53 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -679,6 +679,8 @@ event_trigger_callback(struct event_command *cmd_ops,  		goto out_free;   out_reg: +	/* Up the trigger_data count to make sure reg doesn't free it on failure */ +	event_trigger_init(trigger_ops, trigger_data);  	ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);  	/*  	 * The above returns on success the # of functions enabled, @@ -686,11 +688,13 @@ event_trigger_callback(struct event_command *cmd_ops,  	 * Consider no functions a failure too.  	 */  	if (!ret) { +		cmd_ops->unreg(glob, trigger_ops, trigger_data, file);  		ret = -ENOENT; -		goto out_free; -	} else if (ret < 0) -		goto out_free; -	ret = 0; +	} else if (ret > 0) +		ret = 0; + +	/* Down the counter of trigger_data or free it if not used anymore */ +	event_trigger_free(trigger_ops, trigger_data);   out:  	return ret; @@ -1416,6 +1420,9 @@ int event_enable_trigger_func(struct event_command *cmd_ops,  		goto out;  	} +	/* Up the trigger_data count to make sure nothing frees it on failure */ +	event_trigger_init(trigger_ops, trigger_data); +  	if (trigger) {  		number = strsep(&trigger, ":"); @@ -1466,6 +1473,7 @@ int event_enable_trigger_func(struct event_command *cmd_ops,  		goto out_disable;  	/* Just return zero, not the number of enabled functions */  	ret = 0; +	event_trigger_free(trigger_ops, trigger_data);   out:  	return ret; @@ -1476,7 +1484,7 @@ int event_enable_trigger_func(struct event_command *cmd_ops,   out_free:  	if (cmd_ops->set_filter)  		cmd_ops->set_filter(NULL, trigger_data, NULL); -	kfree(trigger_data); +	event_trigger_free(trigger_ops, trigger_data);  	kfree(enable_data);  	goto out;  } | 
