lkml.org 
[lkml]   [2021]   [Feb]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 18/57] tracing: Check length before giving out the filter buffer
    Date
    From: Steven Rostedt (VMware) <rostedt@goodmis.org>

    commit b220c049d5196dd94d992dd2dc8cba1a5e6123bf upstream.

    When filters are used by trace events, a page is allocated on each CPU and
    used to copy the trace event fields to this page before writing to the ring
    buffer. The reason to use the filter and not write directly into the ring
    buffer is because a filter may discard the event and there's more overhead
    on discarding from the ring buffer than the extra copy.

    The problem here is that there is no check against the size being allocated
    when using this page. If an event asks for more than a page size while being
    filtered, it will get only a page, leading to the caller writing more that
    what was allocated.

    Check the length of the request, and if it is more than PAGE_SIZE minus the
    header default back to allocating from the ring buffer directly. The ring
    buffer may reject the event if its too big anyway, but it wont overflow.

    Link: https://lore.kernel.org/ath10k/1612839593-2308-1-git-send-email-wgong@codeaurora.org/

    Cc: stable@vger.kernel.org
    Fixes: 0fc1b09ff1ff4 ("tracing: Use temp buffer when filtering events")
    Reported-by: Wen Gong <wgong@codeaurora.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/trace/trace.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -2285,7 +2285,7 @@ trace_event_buffer_lock_reserve(struct r
    (entry = this_cpu_read(trace_buffered_event))) {
    /* Try to use the per cpu buffer first */
    val = this_cpu_inc_return(trace_buffered_event_cnt);
    - if (val == 1) {
    + if ((len < (PAGE_SIZE - sizeof(*entry))) && val == 1) {
    trace_event_setup(entry, type, flags, pc);
    entry->array[0] = len;
    return entry;

    \
     
     \ /
      Last update: 2021-02-22 14:05    [W:4.160 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site