On Tue, 2024-08-06 at 10:38 -0700, Yonghong Song wrote: > On 8/6/24 3:51 AM, Ma Ke wrote: > > To prevent potential error return values, it is necessary to check the > > return value of btf__type_by_id. We can add a kind checking to fix the > > issue. > > > > Cc: stable@xxxxxxxxxxxxxxx > > Fixes: 430025e5dca5 ("libbpf: Add subskeleton scaffolding") > > Signed-off-by: Ma Ke <make24@xxxxxxxxxxx> > > --- > > tools/lib/bpf/libbpf.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > > index a3be6f8fac09..d1eb45d16054 100644 > > --- a/tools/lib/bpf/libbpf.c > > +++ b/tools/lib/bpf/libbpf.c > > @@ -13850,6 +13850,9 @@ int bpf_object__open_subskeleton(struct bpf_object_subskeleton *s) > > var = btf_var_secinfos(map_type); > > for (i = 0; i < len; i++, var++) { > > var_type = btf__type_by_id(btf, var->type); > > + if (!var_type) > > + return libbpf_err(-ENOENT); > > Could you give a detailed example when this error could be triggered? I'm curious as well, tools/lib/bpf/btf.c:btf_validate_type() has the following code: static int btf_validate_type(const struct btf *btf, const struct btf_type *t, __u32 id) { ... switch (kind) { ... case ... case BTF_KIND_VAR: case ... err = btf_validate_id(btf, t->type, id); if (err) return err; break; That should catch situations exactly like this one. > > > + > > var_name = btf__name_by_offset(btf, var_type->name_off); > > if (strcmp(var_name, var_skel->name) == 0) { > > *var_skel->addr = map->mmaped + var->offset;