Message ID | 20230409033431.3992432-4-joannelkoong@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | Dynptr convenience helpers | expand |
On Sat, Apr 8, 2023 at 8:34 PM Joanne Koong <joannelkoong@gmail.com> wrote: > > bpf_dynptr_get_size returns the number of useable bytes in a dynptr and > bpf_dynptr_get_offset returns the current offset into the dynptr. > > Signed-off-by: Joanne Koong <joannelkoong@gmail.com> > --- > include/linux/bpf.h | 2 +- > kernel/bpf/helpers.c | 24 +++++++++++++++++++++--- > kernel/trace/bpf_trace.c | 4 ++-- > 3 files changed, 24 insertions(+), 6 deletions(-) > [...] > +__bpf_kfunc __u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr) > +{ > + if (!ptr->data) > + return -EINVAL; > + > + return __bpf_dynptr_get_size(ptr); > +} > + > +__bpf_kfunc __u32 bpf_dynptr_get_offset(const struct bpf_dynptr_kern *ptr) I think get_offset is actually not essential and it's hard to think about the case where this is going to be really necessary. Let's keep only get_size for now? > +{ > + if (!ptr->data) > + return -EINVAL; > + > + return ptr->offset; > +} > + [...]
On Wed, Apr 12, 2023 at 2:52 PM Andrii Nakryiko <andrii.nakryiko@gmail.com> wrote: > > On Sat, Apr 8, 2023 at 8:34 PM Joanne Koong <joannelkoong@gmail.com> wrote: > > > > bpf_dynptr_get_size returns the number of useable bytes in a dynptr and > > bpf_dynptr_get_offset returns the current offset into the dynptr. > > > > Signed-off-by: Joanne Koong <joannelkoong@gmail.com> > > --- > > include/linux/bpf.h | 2 +- > > kernel/bpf/helpers.c | 24 +++++++++++++++++++++--- > > kernel/trace/bpf_trace.c | 4 ++-- > > 3 files changed, 24 insertions(+), 6 deletions(-) > > > > [...] > > > +__bpf_kfunc __u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr) > > +{ > > + if (!ptr->data) > > + return -EINVAL; > > + > > + return __bpf_dynptr_get_size(ptr); > > +} > > + > > +__bpf_kfunc __u32 bpf_dynptr_get_offset(const struct bpf_dynptr_kern *ptr) > > I think get_offset is actually not essential and it's hard to think > about the case where this is going to be really necessary. Let's keep > only get_size for now? > Sounds good, I will remove this from v2 (i'll try to send v2 out next week). Thanks for reviewing this patchset! > > > +{ > > + if (!ptr->data) > > + return -EINVAL; > > + > > + return ptr->offset; > > +} > > + > > [...]
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 002a811b6b90..2a73ddd06e55 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1167,7 +1167,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_get_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); diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index e4e84e92a4c6..bac4c6fe49f0 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -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_get_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_get_size(ptr); if (len > size || offset > size - len) return -E2BIG; @@ -2290,7 +2290,7 @@ static int bpf_dynptr_adjust(struct bpf_dynptr_kern *ptr, u32 off_inc, u32 sz_de if (!ptr->data) return -EINVAL; - size = bpf_dynptr_get_size(ptr); + size = __bpf_dynptr_get_size(ptr); if (sz_dec > size) return -ERANGE; @@ -2335,6 +2335,22 @@ __bpf_kfunc bool bpf_dynptr_is_rdonly(struct bpf_dynptr_kern *ptr) return __bpf_dynptr_is_rdonly(ptr); } +__bpf_kfunc __u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr) +{ + if (!ptr->data) + return -EINVAL; + + return __bpf_dynptr_get_size(ptr); +} + +__bpf_kfunc __u32 bpf_dynptr_get_offset(const struct bpf_dynptr_kern *ptr) +{ + if (!ptr->data) + return -EINVAL; + + return ptr->offset; +} + __bpf_kfunc void *bpf_cast_to_kern_ctx(void *obj) { return obj; @@ -2411,6 +2427,8 @@ BTF_ID_FLAGS(func, bpf_dynptr_trim) BTF_ID_FLAGS(func, bpf_dynptr_advance) BTF_ID_FLAGS(func, bpf_dynptr_is_null) BTF_ID_FLAGS(func, bpf_dynptr_is_rdonly) +BTF_ID_FLAGS(func, bpf_dynptr_get_size) +BTF_ID_FLAGS(func, bpf_dynptr_get_offset) BTF_SET8_END(common_btf_ids) static const struct btf_kfunc_id_set common_kfunc_set = { diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index bcf91bc7bf71..f30bdc72d26c 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -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_get_size(data_ptr), sig_ptr->data, - bpf_dynptr_get_size(sig_ptr), + __bpf_dynptr_get_size(sig_ptr), trusted_keyring->key, VERIFYING_UNSPECIFIED_SIGNATURE, NULL, NULL);
bpf_dynptr_get_size returns the number of useable bytes in a dynptr and bpf_dynptr_get_offset returns the current offset into the dynptr. Signed-off-by: Joanne Koong <joannelkoong@gmail.com> --- include/linux/bpf.h | 2 +- kernel/bpf/helpers.c | 24 +++++++++++++++++++++--- kernel/trace/bpf_trace.c | 4 ++-- 3 files changed, 24 insertions(+), 6 deletions(-)