On Tue, Feb 02, 2021 at 06:23:26PM +1100, Alexey Kardashevskiy wrote:
> When executing a tracepoint, the tracepoint's func is dereferenced twice -
> in __DO_TRACE() (where the returned pointer is checked) and later on in
> __traceiter_##_name where the returned pointer is dereferenced without
> checking which leads to races against tracepoint_removal_sync() and
> crashes.
> 
> This adds a check before referencing the pointer in tracepoint_ptr_deref.

Agreed, a reload got added and it doesn't check the value again.

> Fixes: d25e37d89dd2f ("tracepoint: Optimize using static_call()")
> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru>

>               it_func_ptr =                                           \
>                       rcu_dereference_raw((&__tracepoint_##_name)->funcs); \

> +             if (it_func_ptr) {                                      \
> +                     do {                                            \
> +                             it_func = (it_func_ptr)->func;          \
> +                             __data = (it_func_ptr)->data;           \
> +                             ((void(*)(void *, proto))(it_func))(__data, 
> args); \
> +                     } while ((++it_func_ptr)->func);                \
> +             }                                                       \
>               return 0;                                               \


Acked-by: Peter Zijlstra (Intel) <pet...@infradead.org>

Reply via email to