On Tue, Jun 30, 2020 at 1:05 PM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > On Thu, Jun 25, 2020 at 4:49 PM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > > > Adding btf_struct_address function that takes 2 BTF objects > > and offset as arguments and checks whether object A is nested > > in object B on given offset. > > > > This function will be used when checking the helper function > > PTR_TO_BTF_ID arguments. If the argument has an offset value, > > the btf_struct_address will check if the final address is > > the expected BTF ID. > > > > This way we can access nested BTF objects under PTR_TO_BTF_ID > > pointer type and pass them to helpers, while they still point > > to valid kernel BTF objects. > > > > Using btf_struct_access to implement new btf_struct_address > > function, because it already walks down the given BTF object. > > > > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > > --- > > include/linux/bpf.h | 3 ++ > > kernel/bpf/btf.c | 67 ++++++++++++++++++++++++++++++++++++++----- > > kernel/bpf/verifier.c | 37 +++++++++++++++--------- > > 3 files changed, 87 insertions(+), 20 deletions(-) > > [...] > > > > error: > > bpf_log(log, "access beyond struct %s at off %u size %u\n", > > @@ -4043,9 +4054,21 @@ int btf_struct_access(struct bpf_verifier_log *log, > > > > /* adjust offset we're looking for */ > > off -= moff; > > + > > + /* We are nexting into another struct, > > + * check if we are crossing expected ID. > > + */ > > + if (data->op == ACCESS_EXPECT && !off && t == data->exp_type) > > before you can do this type check, you need to btf_type_skip_modifiers() first. > Ignore this part, btf_resolve_size() (somewhat unexpectedly) already does that. > > + return 0; > > goto again; > > } > > > > + /* We are interested only in structs for expected ID, > > + * bail out. > > + */ > > + if (data->op == ACCESS_EXPECT) > > + return -EINVAL; > > + > > if (btf_type_is_ptr(mtype)) { > > const struct btf_type *stype; > > u32 id; [...]