diff options
author | Kumar Kartikeya Dwivedi <memxor@gmail.com> | 2022-11-18 07:25:57 +0530 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2022-11-17 19:11:32 -0800 |
commit | 865ce09a49d79d2b2c1d980f4c05ffc0b3517bdc (patch) | |
tree | 580599d09445efd8b3ecf9498bae2a4bf83356cd /include/linux/btf.h | |
parent | 8ffa5cc142137a59d6a10eb5273fa2ba5dcd4947 (diff) | |
download | linux-stable-865ce09a49d79d2b2c1d980f4c05ffc0b3517bdc.tar.gz linux-stable-865ce09a49d79d2b2c1d980f4c05ffc0b3517bdc.tar.bz2 linux-stable-865ce09a49d79d2b2c1d980f4c05ffc0b3517bdc.zip |
bpf: Verify ownership relationships for user BTF types
Ensure that there can be no ownership cycles among different types by
way of having owning objects that can hold some other type as their
element. For instance, a map value can only hold allocated objects, but
these are allowed to have another bpf_list_head. To prevent unbounded
recursion while freeing resources, elements of bpf_list_head in local
kptrs can never have a bpf_list_head which are part of list in a map
value. Later patches will verify this by having dedicated BTF selftests.
Also, to make runtime destruction easier, once btf_struct_metas is fully
populated, we can stash the metadata of the value type directly in the
metadata of the list_head fields, as that allows easier access to the
value type's layout to destruct it at runtime from the btf_field entry
of the list head itself.
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20221118015614.2013203-8-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'include/linux/btf.h')
-rw-r--r-- | include/linux/btf.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/btf.h b/include/linux/btf.h index a01a8da20021..42d8f3730a8d 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -178,6 +178,7 @@ int btf_find_spin_lock(const struct btf *btf, const struct btf_type *t); int btf_find_timer(const struct btf *btf, const struct btf_type *t); struct btf_record *btf_parse_fields(const struct btf *btf, const struct btf_type *t, u32 field_mask, u32 value_size); +int btf_check_and_fixup_fields(const struct btf *btf, struct btf_record *rec); struct btf_field_offs *btf_parse_field_offs(struct btf_record *rec); bool btf_type_is_void(const struct btf_type *t); s32 btf_find_by_name_kind(const struct btf *btf, const char *name, u8 kind); |