summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorRoman Gushchin <guro@fb.com>2018-07-13 12:41:11 -0700
committerMichael Bestas <mkbestas@lineageos.org>2022-04-19 00:51:51 +0300
commitbfe07625deded524e7b7c68fdbe26dc0b8ada071 (patch)
tree6e510cc7ab4941097c2a86f2fc0fc6cabd4e6eed /kernel
parent7679bac78e3329a90177649a3a83f087f934fec4 (diff)
UPSTREAM: bpf: fix rcu annotations in compute_effective_progs()
The progs local variable in compute_effective_progs() is marked as __rcu, which is not correct. This is a local pointer, which is initialized by bpf_prog_array_alloc(), which also now returns a generic non-rcu pointer. The real rcu-protected pointer is *array (array is a pointer to an RCU-protected pointer), so the assignment should be performed using rcu_assign_pointer(). Fixes: 324bda9e6c5a ("bpf: multi program support for cgroup+bpf") Signed-off-by: Roman Gushchin <guro@fb.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> (cherry picked from commit 3960f4fd6585608e8cc285d9665821985494e147) Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ie1eec4e3148a4c802759a3f0257dfae4a9333520
Diffstat (limited to 'kernel')
-rw-r--r--kernel/bpf/cgroup.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
index 54c47a93e86e..357ce8355d57 100644
--- a/kernel/bpf/cgroup.c
+++ b/kernel/bpf/cgroup.c
@@ -95,7 +95,7 @@ static int compute_effective_progs(struct cgroup *cgrp,
enum bpf_attach_type type,
struct bpf_prog_array __rcu **array)
{
- struct bpf_prog_array __rcu *progs;
+ struct bpf_prog_array *progs;
struct bpf_prog_list *pl;
struct cgroup *p = cgrp;
int cnt = 0;
@@ -120,13 +120,12 @@ static int compute_effective_progs(struct cgroup *cgrp,
&p->bpf.progs[type], node) {
if (!pl->prog)
continue;
- rcu_dereference_protected(progs, 1)->
- progs[cnt++] = pl->prog;
+ progs->progs[cnt++] = pl->prog;
}
p = cgroup_parent(p);
} while (p);
- *array = progs;
+ rcu_assign_pointer(*array, progs);
return 0;
}