lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0123/1017] tracing: Have trace event string test handle zero length strings
    Date
    From: Steven Rostedt (Google) <rostedt@goodmis.org>

    commit eca344a7362e0f34f179298fd8366bcd556eede1 upstream.

    If a trace event has in its TP_printk():

    "%*.s", len, len ? __get_str(string) : NULL

    It is perfectly valid if len is zero and passing in the NULL.
    Unfortunately, the runtime string check at time of reading the trace sees
    the NULL and flags it as a bad string and produces a WARN_ON().

    Handle this case by passing into the test function if the format has an
    asterisk (star) and if so, if the length is zero, then mark it as safe.

    Link: https://lore.kernel.org/all/YjsWzuw5FbWPrdqq@bfoster/

    Cc: stable@vger.kernel.org
    Reported-by: Brian Foster <bfoster@redhat.com>
    Tested-by: Brian Foster <bfoster@redhat.com>
    Fixes: 9a6944fee68e2 ("tracing: Add a verifier to check string pointers for trace events")
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/trace/trace.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -3654,12 +3654,17 @@ static char *trace_iter_expand_format(st
    }

    /* Returns true if the string is safe to dereference from an event */
    -static bool trace_safe_str(struct trace_iterator *iter, const char *str)
    +static bool trace_safe_str(struct trace_iterator *iter, const char *str,
    + bool star, int len)
    {
    unsigned long addr = (unsigned long)str;
    struct trace_event *trace_event;
    struct trace_event_call *event;

    + /* Ignore strings with no length */
    + if (star && !len)
    + return true;
    +
    /* OK if part of the event data */
    if ((addr >= (unsigned long)iter->ent) &&
    (addr < (unsigned long)iter->ent + iter->ent_size))
    @@ -3845,7 +3850,7 @@ void trace_check_vprintf(struct trace_it
    * instead. See samples/trace_events/trace-events-sample.h
    * for reference.
    */
    - if (WARN_ONCE(!trace_safe_str(iter, str),
    + if (WARN_ONCE(!trace_safe_str(iter, str, star, len),
    "fmt: '%s' current_buffer: '%s'",
    fmt, show_buffer(&iter->seq))) {
    int ret;

    \
     
     \ /
      Last update: 2022-04-05 14:33    [W:4.088 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site