Commit 8d093b4e authored by Alexei Starovoitov's avatar Alexei Starovoitov Committed by Daniel Borkmann

bpf: Mark cgroups and dfl_cgrp fields as trusted.

bpf programs sometimes do:
bpf_cgrp_storage_get(&map, task->cgroups->dfl_cgrp, ...);
It is safe to do, because cgroups->dfl_cgrp pointer is set diring init and
never changes. The task->cgroups is also never NULL. It is also set during init
and will change when task switches cgroups. For any trusted task pointer
dereference of cgroups and dfl_cgrp should yield trusted pointers. The verifier
wasn't aware of this. Hence in gcc compiled kernels task->cgroups dereference
was producing PTR_TO_BTF_ID without modifiers while in clang compiled kernels
the verifier recognizes __rcu tag in cgroups field and produces
PTR_TO_BTF_ID | MEM_RCU | MAYBE_NULL.
Tag cgroups and dfl_cgrp as trusted to equalize clang and gcc behavior.
When GCC supports btf_type_tag such tagging will done directly in the type.
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarDavid Vernet <void@manifault.com>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/bpf/20230303041446.3630-3-alexei.starovoitov@gmail.com
parent 03b77e17
...@@ -5046,6 +5046,11 @@ static int bpf_map_direct_read(struct bpf_map *map, int off, int size, u64 *val) ...@@ -5046,6 +5046,11 @@ static int bpf_map_direct_read(struct bpf_map *map, int off, int size, u64 *val)
BTF_TYPE_SAFE_NESTED(struct task_struct) { BTF_TYPE_SAFE_NESTED(struct task_struct) {
const cpumask_t *cpus_ptr; const cpumask_t *cpus_ptr;
struct css_set __rcu *cgroups;
};
BTF_TYPE_SAFE_NESTED(struct css_set) {
struct cgroup *dfl_cgrp;
}; };
static bool nested_ptr_is_trusted(struct bpf_verifier_env *env, static bool nested_ptr_is_trusted(struct bpf_verifier_env *env,
...@@ -5057,6 +5062,7 @@ static bool nested_ptr_is_trusted(struct bpf_verifier_env *env, ...@@ -5057,6 +5062,7 @@ static bool nested_ptr_is_trusted(struct bpf_verifier_env *env,
return false; return false;
BTF_TYPE_EMIT(BTF_TYPE_SAFE_NESTED(struct task_struct)); BTF_TYPE_EMIT(BTF_TYPE_SAFE_NESTED(struct task_struct));
BTF_TYPE_EMIT(BTF_TYPE_SAFE_NESTED(struct css_set));
return btf_nested_type_is_trusted(&env->log, reg, off); return btf_nested_type_is_trusted(&env->log, reg, off);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment