On Tue, May 28, 2019 at 11:29:43AM -0700, Stanislav Fomichev wrote:
> Drop __rcu annotations and rcu read sections from bpf_prog_array
> helper functions. They are not needed since all existing callers
> call those helpers from the rcu update side while holding a mutex.
> This guarantees that use-after-free could not happen.
> 
> In the next patches I'll fix the callers with missing
> rcu_dereference_protected to make sparse/lockdep happy, the proper
> way to use these helpers is:
> 
>       struct bpf_prog_array __rcu *progs = ...;
>       struct bpf_prog_array *p;
> 
>       mutex_lock(&mtx);
>       p = rcu_dereference_protected(progs, lockdep_is_held(&mtx));
>       bpf_prog_array_length(p);
>       bpf_prog_array_copy_to_user(p, ...);
>       bpf_prog_array_delete_safe(p, ...);
>       bpf_prog_array_copy_info(p, ...);
>       bpf_prog_array_copy(p, ...);
>       bpf_prog_array_free(p);
>       mutex_unlock(&mtx);
> 
> No functional changes! rcu_dereference_protected with lockdep_is_held
> should catch any cases where we update prog array without a mutex
> (I've looked at existing call sites and I think we hold a mutex
> everywhere).
> 
> Motivation is to fix sparse warnings:
> kernel/bpf/core.c:1803:9: warning: incorrect type in argument 1 (different 
> address spaces)
> kernel/bpf/core.c:1803:9:    expected struct callback_head *head
> kernel/bpf/core.c:1803:9:    got struct callback_head [noderef] <asn:4> *
> kernel/bpf/core.c:1877:44: warning: incorrect type in initializer (different 
> address spaces)
> kernel/bpf/core.c:1877:44:    expected struct bpf_prog_array_item *item
> kernel/bpf/core.c:1877:44:    got struct bpf_prog_array_item [noderef] 
> <asn:4> *
> kernel/bpf/core.c:1901:26: warning: incorrect type in assignment (different 
> address spaces)
> kernel/bpf/core.c:1901:26:    expected struct bpf_prog_array_item *existing
> kernel/bpf/core.c:1901:26:    got struct bpf_prog_array_item [noderef] 
> <asn:4> *
> kernel/bpf/core.c:1935:26: warning: incorrect type in assignment (different 
> address spaces)
> kernel/bpf/core.c:1935:26:    expected struct bpf_prog_array_item *[assigned] 
> existing
> kernel/bpf/core.c:1935:26:    got struct bpf_prog_array_item [noderef] 
> <asn:4> *
> 
> v2:
> * remove comment about potential race; that can't happen
>   because all callers are in rcu-update section
> 
> Cc: Roman Gushchin <g...@fb.com>
> Signed-off-by: Stanislav Fomichev <s...@google.com>

Acked-by: Roman Gushchin <g...@fb.com>

Thanks!

Reply via email to