• Steven Rostedt (VMware)'s avatar
    tracepoint: Do not fail unregistering a probe due to memory failure · befe6d94
    Steven Rostedt (VMware) authored
    The list of tracepoint callbacks is managed by an array that is protected
    by RCU. To update this array, a new array is allocated, the updates are
    copied over to the new array, and then the list of functions for the
    tracepoint is switched over to the new array. After a completion of an RCU
    grace period, the old array is freed.
    
    This process happens for both adding a callback as well as removing one.
    But on removing a callback, if the new array fails to be allocated, the
    callback is not removed, and may be used after it is freed by the clients
    of the tracepoint.
    
    There's really no reason to fail if the allocation for a new array fails
    when removing a function. Instead, the function can simply be replaced by a
    stub function that could be cleaned up on the next modification of the
    array. That is, instead of calling the function registered to the
    tracepoint, it would call a stub function in its place.
    
    Link: https://lore.kernel.org/r/20201115055256.65625-1-mmullins@mmlx.us
    Link: https://lore.kernel.org/r/20201116175107.02db396d@gandalf.local.home
    Link: https://lore.kernel.org/r/20201117211836.54acaef2@oasis.local.home
    Link: https://lkml.kernel.org/r/20201118093405.7a6d2290@gandalf.local.home
    
    [ Note, this version does use undefined compiler behavior (assuming that
      a stub function with no parameters or return, can be called by a location
      that thinks it has parameters but still no return value. Static calls
      do the same thing, so this trick is not without precedent.
    
      There's another solution that uses RCU tricks and is more complex, but
      can be an alternative if this solution becomes an issue.
    
      Link: https://lore.kernel.org/lkml/20210127170721.58bce7cc@gandalf.local.home/
    ]
    
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: Yonghong Song <yhs@fb.com>
    Cc: Andrii Nakryiko <andriin@fb.com>
    Cc: John Fastabend <john.fastabend@gmail.com>
    Cc: KP Singh <kpsingh@chromium.org>
    Cc: netdev <netdev@vger.kernel.org>
    Cc: bpf <bpf@vger.kernel.org>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Florian Weimer <fw@deneb.enyo.de>
    Fixes: 97e1c18e ("tracing: Kernel Tracepoints")
    Reported-by: syzbot+83aa762ef23b6f0d1991@syzkaller.appspotmail.com
    Reported-by: syzbot+d29e58bb557324e55e5e@syzkaller.appspotmail.com
    Reported-by: default avatarMatt Mullins <mmullins@mmlx.us>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    Tested-by: default avatarMatt Mullins <mmullins@mmlx.us>
    befe6d94
tracepoint.c 16.8 KB