lkml.org 
[lkml]   [2018]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 010/205] tracing/kprobes: Check the probe on unloaded module correctly
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Masami Hiramatsu <mhiramat@kernel.org>

    [ Upstream commit 59158ec4aef7d44be51a6f3e7e17fc64c32604eb ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/trace/trace_kprobe.c | 39 ++++++++++++++++++++++++++-------------
    1 file changed, 26 insertions(+), 13 deletions(-)

    --- a/kernel/trace/trace_kprobe.c
    +++ b/kernel/trace/trace_kprobe.c
    @@ -61,9 +61,23 @@ static nokprobe_inline bool trace_kprobe
    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)
    @@ -554,19 +568,13 @@ static int __register_trace_kprobe(struc
    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;
    }

    @@ -629,6 +637,11 @@ static int register_trace_kprobe(struct

    /* 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

    \
     
     \ /
      Last update: 2018-11-19 17:30    [W:4.745 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site