Commit 26662d73 authored by Joanne Koong's avatar Joanne Koong Committed by Daniel Borkmann

bpf: Add bpf_dynptr_size

bpf_dynptr_size returns the number of usable bytes in a dynptr.
Signed-off-by: default avatarJoanne Koong <joannelkoong@gmail.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20230420071414.570108-4-joannelkoong@gmail.com
parent 540ccf96
...@@ -1197,7 +1197,7 @@ enum bpf_dynptr_type { ...@@ -1197,7 +1197,7 @@ enum bpf_dynptr_type {
}; };
int bpf_dynptr_check_size(u32 size); int bpf_dynptr_check_size(u32 size);
u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr); u32 __bpf_dynptr_size(const struct bpf_dynptr_kern *ptr);
#ifdef CONFIG_BPF_JIT #ifdef CONFIG_BPF_JIT
int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr); int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr);
......
...@@ -1443,7 +1443,7 @@ static enum bpf_dynptr_type bpf_dynptr_get_type(const struct bpf_dynptr_kern *pt ...@@ -1443,7 +1443,7 @@ static enum bpf_dynptr_type bpf_dynptr_get_type(const struct bpf_dynptr_kern *pt
return (ptr->size & ~(DYNPTR_RDONLY_BIT)) >> DYNPTR_TYPE_SHIFT; return (ptr->size & ~(DYNPTR_RDONLY_BIT)) >> DYNPTR_TYPE_SHIFT;
} }
u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr) u32 __bpf_dynptr_size(const struct bpf_dynptr_kern *ptr)
{ {
return ptr->size & DYNPTR_SIZE_MASK; return ptr->size & DYNPTR_SIZE_MASK;
} }
...@@ -1476,7 +1476,7 @@ void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr) ...@@ -1476,7 +1476,7 @@ void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr)
static int bpf_dynptr_check_off_len(const struct bpf_dynptr_kern *ptr, u32 offset, u32 len) static int bpf_dynptr_check_off_len(const struct bpf_dynptr_kern *ptr, u32 offset, u32 len)
{ {
u32 size = bpf_dynptr_get_size(ptr); u32 size = __bpf_dynptr_size(ptr);
if (len > size || offset > size - len) if (len > size || offset > size - len)
return -E2BIG; return -E2BIG;
...@@ -2311,7 +2311,7 @@ __bpf_kfunc int bpf_dynptr_adjust(struct bpf_dynptr_kern *ptr, u32 start, u32 en ...@@ -2311,7 +2311,7 @@ __bpf_kfunc int bpf_dynptr_adjust(struct bpf_dynptr_kern *ptr, u32 start, u32 en
if (!ptr->data || start > end) if (!ptr->data || start > end)
return -EINVAL; return -EINVAL;
size = bpf_dynptr_get_size(ptr); size = __bpf_dynptr_size(ptr);
if (start > size || end > size) if (start > size || end > size)
return -ERANGE; return -ERANGE;
...@@ -2335,6 +2335,14 @@ __bpf_kfunc bool bpf_dynptr_is_rdonly(struct bpf_dynptr_kern *ptr) ...@@ -2335,6 +2335,14 @@ __bpf_kfunc bool bpf_dynptr_is_rdonly(struct bpf_dynptr_kern *ptr)
return __bpf_dynptr_is_rdonly(ptr); return __bpf_dynptr_is_rdonly(ptr);
} }
__bpf_kfunc __u32 bpf_dynptr_size(const struct bpf_dynptr_kern *ptr)
{
if (!ptr->data)
return -EINVAL;
return __bpf_dynptr_size(ptr);
}
__bpf_kfunc void *bpf_cast_to_kern_ctx(void *obj) __bpf_kfunc void *bpf_cast_to_kern_ctx(void *obj)
{ {
return obj; return obj;
...@@ -2410,6 +2418,7 @@ BTF_ID_FLAGS(func, bpf_iter_num_destroy, KF_ITER_DESTROY) ...@@ -2410,6 +2418,7 @@ BTF_ID_FLAGS(func, bpf_iter_num_destroy, KF_ITER_DESTROY)
BTF_ID_FLAGS(func, bpf_dynptr_adjust) BTF_ID_FLAGS(func, bpf_dynptr_adjust)
BTF_ID_FLAGS(func, bpf_dynptr_is_null) BTF_ID_FLAGS(func, bpf_dynptr_is_null)
BTF_ID_FLAGS(func, bpf_dynptr_is_rdonly) BTF_ID_FLAGS(func, bpf_dynptr_is_rdonly)
BTF_ID_FLAGS(func, bpf_dynptr_size)
BTF_SET8_END(common_btf_ids) BTF_SET8_END(common_btf_ids)
static const struct btf_kfunc_id_set common_kfunc_set = { static const struct btf_kfunc_id_set common_kfunc_set = {
......
...@@ -1349,9 +1349,9 @@ __bpf_kfunc int bpf_verify_pkcs7_signature(struct bpf_dynptr_kern *data_ptr, ...@@ -1349,9 +1349,9 @@ __bpf_kfunc int bpf_verify_pkcs7_signature(struct bpf_dynptr_kern *data_ptr,
} }
return verify_pkcs7_signature(data_ptr->data, return verify_pkcs7_signature(data_ptr->data,
bpf_dynptr_get_size(data_ptr), __bpf_dynptr_size(data_ptr),
sig_ptr->data, sig_ptr->data,
bpf_dynptr_get_size(sig_ptr), __bpf_dynptr_size(sig_ptr),
trusted_keyring->key, trusted_keyring->key,
VERIFYING_UNSPECIFIED_SIGNATURE, NULL, VERIFYING_UNSPECIFIED_SIGNATURE, NULL,
NULL); NULL);
......
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