bpf: Add bpf_dynptr_clone
authorJoanne Koong <joannelkoong@gmail.com>
Thu, 20 Apr 2023 07:14:13 +0000 (00:14 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 27 Apr 2023 08:40:47 +0000 (10:40 +0200)
commit361f129f3cc185af6667aca0bec0be9a020a8abc
tree34587e5ec1dee5ecabbc624c5a0e1b818c8fb251
parent26662d7347a058ca497792c4b22ac91cc415cbf6
bpf: Add bpf_dynptr_clone

The cloned dynptr will point to the same data as its parent dynptr,
with the same type, offset, size and read-only properties.

Any writes to a dynptr will be reflected across all instances
(by 'instance', this means any dynptrs that point to the same
underlying data).

Please note that data slice and dynptr invalidations will affect all
instances as well. For example, if bpf_dynptr_write() is called on an
skb-type dynptr, all data slices of dynptr instances to that skb
will be invalidated as well (eg data slices of any clones, parents,
grandparents, ...). Another example is if a ringbuf dynptr is submitted,
any instance of that dynptr will be invalidated.

Changing the view of the dynptr (eg advancing the offset or
trimming the size) will only affect that dynptr and not affect any
other instances.

One example use case where cloning may be helpful is for hashing or
iterating through dynptr data. Cloning will allow the user to maintain
the original view of the dynptr for future use, while also allowing
views to smaller subsets of the data after the offset is advanced or the
size is trimmed.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20230420071414.570108-5-joannelkoong@gmail.com
kernel/bpf/helpers.c
kernel/bpf/verifier.c