Skip to content

Commit

Permalink
tracing/kprobes: Check the probe on unloaded module correctly
Browse files Browse the repository at this point in the history
Current kprobe event doesn't checks correctly whether the
given event is on unloaded module or not. It just checks
the event has ":" in the name.

That is not enough because if we define a probe on non-exist
symbol on loaded module, it allows to define that (with
warning message)

To ensure it correctly, this searches the module name on
loaded module list and only if there is not, it allows to
define it. (this event will be available when the target
module is loaded)

Link: http://lkml.kernel.org/r/153547309528.26502.8300278470528281328.stgit@devbox

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
  • Loading branch information
mhiramat authored and rostedt committed Oct 11, 2018
1 parent f3f5893 commit 59158ec
Showing 1 changed file with 26 additions and 13 deletions.
39 changes: 26 additions & 13 deletions kernel/trace/trace_kprobe.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,23 @@ static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk,
return strncmp(mod->name, name, len) == 0 && name[len] == ':';
}

static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk)
static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk)
{
return !!strchr(trace_kprobe_symbol(tk), ':');
char *p;
bool ret;

if (!tk->symbol)
return false;
p = strchr(tk->symbol, ':');
if (!p)
return true;
*p = '\0';
mutex_lock(&module_mutex);
ret = !!find_module(tk->symbol);
mutex_unlock(&module_mutex);
*p = ':';

return ret;
}

static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk)
Expand Down Expand Up @@ -374,19 +388,13 @@ static int __register_trace_kprobe(struct trace_kprobe *tk)
else
ret = register_kprobe(&tk->rp.kp);

if (ret == 0)
if (ret == 0) {
tk->tp.flags |= TP_FLAG_REGISTERED;
else {
if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) {
pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
ret = 0;
} else if (ret == -EILSEQ) {
pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
tk->rp.kp.addr);
ret = -EINVAL;
}
} else if (ret == -EILSEQ) {
pr_warn("Probing address(0x%p) is not an instruction boundary.\n",
tk->rp.kp.addr);
ret = -EINVAL;
}

return ret;
}

Expand Down Expand Up @@ -449,6 +457,11 @@ static int register_trace_kprobe(struct trace_kprobe *tk)

/* Register k*probe */
ret = __register_trace_kprobe(tk);
if (ret == -ENOENT && !trace_kprobe_module_exist(tk)) {
pr_warn("This probe might be able to register after target module is loaded. Continue.\n");
ret = 0;
}

if (ret < 0)
unregister_kprobe_event(tk);
else
Expand Down

0 comments on commit 59158ec

Please sign in to comment.