On Tue, 2023-12-12 at 15:25 -0800, Andrii Nakryiko wrote: > Add ability to pass a pointer to dynptr into global functions. > This allows to have global subprogs that accept and work with generic > dynptrs that are created by caller. Dynptr argument is detected based on > the name of a struct type, if it's "bpf_dynptr", it's assumed to be > a proper dynptr pointer. Both actual struct and forward struct > declaration types are supported. > > This is conceptually exactly the same semantics as > bpf_user_ringbuf_drain()'s use of dynptr to pass a variable-sized > pointer to ringbuf record. So we heavily rely on CONST_PTR_TO_DYNPTR > bits of already existing logic in the verifier. > > During global subprog validation, we mark such CONST_PTR_TO_DYNPTR as > having LOCAL type, as that's the most unassuming type of dynptr and it > doesn't have any special helpers that can try to free or acquire extra > references (unlike skb, xdp, or ringbuf dynptr). So that seems like a safe > "choice" to make from correctness standpoint. It's still possible to > pass any type of dynptr to such subprog, though, because generic dynptr > helpers, like getting data/slice pointers, read/write memory copying > routines, dynptr adjustment and getter routines all work correctly with > any type of dynptr. > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > --- Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx>