bpf: Add bpf_dynptr_size
authorJoanne Koong <joannelkoong@gmail.com>
Thu, 20 Apr 2023 07:14:12 +0000 (00:14 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 27 Apr 2023 08:40:41 +0000 (10:40 +0200)
bpf_dynptr_size returns the number of usable bytes in a dynptr.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20230420071414.570108-4-joannelkoong@gmail.com
include/linux/bpf.h
kernel/bpf/helpers.c
kernel/trace/bpf_trace.c

index e53ceee1df370ed1c9b5e128a6fa75165dc6c2a6..456f33b9d205e0276cab1e3372fc8e979dd25466 100644 (file)
@@ -1197,7 +1197,7 @@ enum bpf_dynptr_type {
 };
 
 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
 int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr);
index a683b3e71a2815c1f20504f665d298464a5f1b19..c465e97733b94b4308eff586ab6e5a6a9118a262 100644 (file)
@@ -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;
 }
 
-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;
 }
@@ -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)
 {
-       u32 size = bpf_dynptr_get_size(ptr);
+       u32 size = __bpf_dynptr_size(ptr);
 
        if (len > size || offset > size - len)
                return -E2BIG;
@@ -2311,7 +2311,7 @@ __bpf_kfunc int bpf_dynptr_adjust(struct bpf_dynptr_kern *ptr, u32 start, u32 en
        if (!ptr->data || start > end)
                return -EINVAL;
 
-       size = bpf_dynptr_get_size(ptr);
+       size = __bpf_dynptr_size(ptr);
 
        if (start > size || end > size)
                return -ERANGE;
@@ -2335,6 +2335,14 @@ __bpf_kfunc bool bpf_dynptr_is_rdonly(struct bpf_dynptr_kern *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)
 {
        return obj;
@@ -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_is_null)
 BTF_ID_FLAGS(func, bpf_dynptr_is_rdonly)
+BTF_ID_FLAGS(func, bpf_dynptr_size)
 BTF_SET8_END(common_btf_ids)
 
 static const struct btf_kfunc_id_set common_kfunc_set = {
index bcf91bc7bf71fdb7ff6ba773c4372cdeb019fdde..8deb22a99abe5ca5d0f28a774d87057606f2c8a9 100644 (file)
@@ -1349,9 +1349,9 @@ __bpf_kfunc int bpf_verify_pkcs7_signature(struct bpf_dynptr_kern *data_ptr,
        }
 
        return verify_pkcs7_signature(data_ptr->data,
-                                     bpf_dynptr_get_size(data_ptr),
+                                     __bpf_dynptr_size(data_ptr),
                                      sig_ptr->data,
-                                     bpf_dynptr_get_size(sig_ptr),
+                                     __bpf_dynptr_size(sig_ptr),
                                      trusted_keyring->key,
                                      VERIFYING_UNSPECIFIED_SIGNATURE, NULL,
                                      NULL);