On Wed, Feb 16, 2022 at 1:21 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > The commit e5043894b21f ("bpftool: Use libbpf_get_error() to check error") > fails to dump map without BTF loaded in pretty mode (-p option). > > Fixing this by making sure get_map_kv_btf won't fail in case there's > no BTF available for the map. > > Cc: Yinjun Zhang <yinjun.zhang@xxxxxxxxxxxx> > Fixes: e5043894b21f ("bpftool: Use libbpf_get_error() to check error") > Suggested-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > --- > tools/bpf/bpftool/map.c | 29 +++++++++++++---------------- > 1 file changed, 13 insertions(+), 16 deletions(-) > > diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c > index 7a341a472ea4..8562add7417d 100644 > --- a/tools/bpf/bpftool/map.c > +++ b/tools/bpf/bpftool/map.c > @@ -805,29 +805,28 @@ static int maps_have_btf(int *fds, int nb_fds) > > static struct btf *btf_vmlinux; > > -static struct btf *get_map_kv_btf(const struct bpf_map_info *info) > +static int get_map_kv_btf(const struct bpf_map_info *info, struct btf **btf) > { > - struct btf *btf = NULL; > + int err = 0; > > if (info->btf_vmlinux_value_type_id) { > if (!btf_vmlinux) { > btf_vmlinux = libbpf_find_kernel_btf(); > - if (libbpf_get_error(btf_vmlinux)) > + err = libbpf_get_error(btf_vmlinux); > + if (err) { > p_err("failed to get kernel btf"); > + return err; > + } > } > - return btf_vmlinux; > + *btf = btf_vmlinux; > } else if (info->btf_value_type_id) { > - int err; > - > - btf = btf__load_from_kernel_by_id(info->btf_id); > - err = libbpf_get_error(btf); > - if (err) { > + *btf = btf__load_from_kernel_by_id(info->btf_id); > + err = libbpf_get_error(*btf); > + if (err) > p_err("failed to get btf"); > - btf = ERR_PTR(err); > - } > } get_map_kv_btf is supposed to set btf to NULL, otherwise you can get a crash in the caller I've added else { *btf = NULL; } and force-pushed > > - return btf; > + return err; > } > > static void free_map_kv_btf(struct btf *btf) > @@ -862,8 +861,7 @@ map_dump(int fd, struct bpf_map_info *info, json_writer_t *wtr, > prev_key = NULL; > > if (wtr) { > - btf = get_map_kv_btf(info); > - err = libbpf_get_error(btf); > + err = get_map_kv_btf(info, &btf); > if (err) { > goto exit_free; > } > @@ -1054,8 +1052,7 @@ static void print_key_value(struct bpf_map_info *info, void *key, > json_writer_t *btf_wtr; > struct btf *btf; > > - btf = get_map_kv_btf(info); > - if (libbpf_get_error(btf)) > + if (get_map_kv_btf(info, &btf)) > return; > > if (json_output) { > -- > 2.35.1 >