Skip to content

Commit

Permalink
tracing/uprobes: Fix the usage of uprobe_buffer_enable() in probe_eve…
Browse files Browse the repository at this point in the history
…nt_enable()

The usage of uprobe_buffer_enable() added by dcad1a2 is very wrong,

1. uprobe_buffer_enable() and uprobe_buffer_disable() are not balanced,
   _enable() should be called only if !enabled.

2. If uprobe_buffer_enable() fails probe_event_enable() should clear
   tp.flags and free event_file_link.

3. If uprobe_register() fails it should do uprobe_buffer_disable().

Link: http://lkml.kernel.org/p/[email protected]

Acked-by: Namhyung Kim <[email protected]>
Acked-by: Srikar Dronamraju <[email protected]>
Reviewed-by: Masami Hiramatsu <[email protected]>
Fixes: dcad1a2 "tracing/uprobes: Fetch args before reserving a ring buffer"
Signed-off-by: Oleg Nesterov <[email protected]>
Signed-off-by: Steven Rostedt <[email protected]>
  • Loading branch information
oleg-nesterov authored and rostedt committed Jun 30, 2014
1 parent f786106 commit fb6bab6
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions kernel/trace/trace_uprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -911,26 +911,33 @@ probe_event_enable(struct trace_uprobe *tu, struct ftrace_event_file *file,
tu->tp.flags |= TP_FLAG_PROFILE;
}

ret = uprobe_buffer_enable();
if (ret < 0)
return ret;

WARN_ON(!uprobe_filter_is_empty(&tu->filter));

if (enabled)
return 0;

ret = uprobe_buffer_enable();
if (ret)
goto err_flags;

tu->consumer.filter = filter;
ret = uprobe_register(tu->inode, tu->offset, &tu->consumer);
if (ret) {
if (file) {
list_del(&link->list);
kfree(link);
tu->tp.flags &= ~TP_FLAG_TRACE;
} else
tu->tp.flags &= ~TP_FLAG_PROFILE;
}
if (ret)
goto err_buffer;

return 0;

err_buffer:
uprobe_buffer_disable();

err_flags:
if (file) {
list_del(&link->list);
kfree(link);
tu->tp.flags &= ~TP_FLAG_TRACE;
} else {
tu->tp.flags &= ~TP_FLAG_PROFILE;
}
return ret;
}

Expand Down

0 comments on commit fb6bab6

Please sign in to comment.