bpftool: Use libbpf_get_error() to check error
authorHengqi Chen <hengqi.chen@gmail.com>
Mon, 15 Nov 2021 01:24:36 +0000 (09:24 +0800)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 15 Nov 2021 02:38:13 +0000 (18:38 -0800)
Currently, LIBBPF_STRICT_ALL mode is enabled by default for
bpftool which means on error cases, some libbpf APIs would
return NULL pointers. This makes IS_ERR check failed to detect
such cases and result in segfault error. Use libbpf_get_error()
instead like we do in libbpf itself.

Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20211115012436.3143318-1-hengqi.chen@gmail.com
tools/bpf/bpftool/btf.c
tools/bpf/bpftool/gen.c
tools/bpf/bpftool/iter.c
tools/bpf/bpftool/map.c
tools/bpf/bpftool/struct_ops.c

index c7e3b0b..5983312 100644 (file)
@@ -421,8 +421,9 @@ static int dump_btf_c(const struct btf *btf,
        int err = 0, i;
 
        d = btf_dump__new(btf, btf_dump_printf, NULL, NULL);
-       if (IS_ERR(d))
-               return PTR_ERR(d);
+       err = libbpf_get_error(d);
+       if (err)
+               return err;
 
        printf("#ifndef __VMLINUX_H__\n");
        printf("#define __VMLINUX_H__\n");
@@ -549,8 +550,8 @@ static int do_dump(int argc, char **argv)
                }
 
                btf = btf__parse_split(*argv, base ?: base_btf);
-               if (IS_ERR(btf)) {
-                       err = -PTR_ERR(btf);
+               err = libbpf_get_error(btf);
+               if (err) {
                        btf = NULL;
                        p_err("failed to load BTF from %s: %s",
                              *argv, strerror(err));
index 89f0e82..997a286 100644 (file)
@@ -219,8 +219,9 @@ static int codegen_datasecs(struct bpf_object *obj, const char *obj_name)
        int i, err = 0;
 
        d = btf_dump__new(btf, codegen_btf_dump_printf, NULL, NULL);
-       if (IS_ERR(d))
-               return PTR_ERR(d);
+       err = libbpf_get_error(d);
+       if (err)
+               return err;
 
        bpf_object__for_each_map(map, obj) {
                /* only generate definitions for memory-mapped internal maps */
@@ -719,10 +720,11 @@ static int do_skeleton(int argc, char **argv)
                get_obj_name(obj_name, file);
        opts.object_name = obj_name;
        obj = bpf_object__open_mem(obj_data, file_sz, &opts);
-       if (IS_ERR(obj)) {
+       err = libbpf_get_error(obj);
+       if (err) {
                char err_buf[256];
 
-               libbpf_strerror(PTR_ERR(obj), err_buf, sizeof(err_buf));
+               libbpf_strerror(err, err_buf, sizeof(err_buf));
                p_err("failed to open BPF object file: %s", err_buf);
                obj = NULL;
                goto out;
index 6c0de64..f88fdc8 100644 (file)
@@ -46,7 +46,8 @@ static int do_pin(int argc, char **argv)
        }
 
        obj = bpf_object__open(objfile);
-       if (IS_ERR(obj)) {
+       err = libbpf_get_error(obj);
+       if (err) {
                p_err("can't open objfile %s", objfile);
                goto close_map_fd;
        }
@@ -64,8 +65,8 @@ static int do_pin(int argc, char **argv)
        }
 
        link = bpf_program__attach_iter(prog, &iter_opts);
-       if (IS_ERR(link)) {
-               err = PTR_ERR(link);
+       err = libbpf_get_error(link);
+       if (err) {
                p_err("attach_iter failed for program %s",
                      bpf_program__name(prog));
                goto close_obj;
index 68cb121..25b2588 100644 (file)
@@ -812,7 +812,7 @@ static struct btf *get_map_kv_btf(const struct bpf_map_info *info)
        if (info->btf_vmlinux_value_type_id) {
                if (!btf_vmlinux) {
                        btf_vmlinux = libbpf_find_kernel_btf();
-                       if (IS_ERR(btf_vmlinux))
+                       if (libbpf_get_error(btf_vmlinux))
                                p_err("failed to get kernel btf");
                }
                return btf_vmlinux;
@@ -832,13 +832,13 @@ static struct btf *get_map_kv_btf(const struct bpf_map_info *info)
 
 static void free_map_kv_btf(struct btf *btf)
 {
-       if (!IS_ERR(btf) && btf != btf_vmlinux)
+       if (!libbpf_get_error(btf) && btf != btf_vmlinux)
                btf__free(btf);
 }
 
 static void free_btf_vmlinux(void)
 {
-       if (!IS_ERR(btf_vmlinux))
+       if (!libbpf_get_error(btf_vmlinux))
                btf__free(btf_vmlinux);
 }
 
@@ -863,8 +863,8 @@ map_dump(int fd, struct bpf_map_info *info, json_writer_t *wtr,
 
        if (wtr) {
                btf = get_map_kv_btf(info);
-               if (IS_ERR(btf)) {
-                       err = PTR_ERR(btf);
+               err = libbpf_get_error(btf);
+               if (err) {
                        goto exit_free;
                }
 
index 20f803d..cbdca37 100644 (file)
@@ -32,7 +32,7 @@ static const struct btf *get_btf_vmlinux(void)
                return btf_vmlinux;
 
        btf_vmlinux = libbpf_find_kernel_btf();
-       if (IS_ERR(btf_vmlinux))
+       if (libbpf_get_error(btf_vmlinux))
                p_err("struct_ops requires kernel CONFIG_DEBUG_INFO_BTF=y");
 
        return btf_vmlinux;
@@ -45,7 +45,7 @@ static const char *get_kern_struct_ops_name(const struct bpf_map_info *info)
        const char *st_ops_name;
 
        kern_btf = get_btf_vmlinux();
-       if (IS_ERR(kern_btf))
+       if (libbpf_get_error(kern_btf))
                return "<btf_vmlinux_not_found>";
 
        t = btf__type_by_id(kern_btf, info->btf_vmlinux_value_type_id);
@@ -63,7 +63,7 @@ static __s32 get_map_info_type_id(void)
                return map_info_type_id;
 
        kern_btf = get_btf_vmlinux();
-       if (IS_ERR(kern_btf)) {
+       if (libbpf_get_error(kern_btf)) {
                map_info_type_id = PTR_ERR(kern_btf);
                return map_info_type_id;
        }
@@ -415,7 +415,7 @@ static int do_dump(int argc, char **argv)
        }
 
        kern_btf = get_btf_vmlinux();
-       if (IS_ERR(kern_btf))
+       if (libbpf_get_error(kern_btf))
                return -1;
 
        if (!json_output) {
@@ -495,7 +495,7 @@ static int do_register(int argc, char **argv)
        file = GET_ARG();
 
        obj = bpf_object__open(file);
-       if (IS_ERR_OR_NULL(obj))
+       if (libbpf_get_error(obj))
                return -1;
 
        set_max_rlimit();
@@ -516,7 +516,7 @@ static int do_register(int argc, char **argv)
                        continue;
 
                link = bpf_map__attach_struct_ops(map);
-               if (IS_ERR(link)) {
+               if (libbpf_get_error(link)) {
                        p_err("can't register struct_ops %s: %s",
                              bpf_map__name(map),
                              strerror(-PTR_ERR(link)));
@@ -596,7 +596,7 @@ int do_struct_ops(int argc, char **argv)
 
        err = cmd_select(cmds, argc, argv, do_help);
 
-       if (!IS_ERR(btf_vmlinux))
+       if (!libbpf_get_error(btf_vmlinux))
                btf__free(btf_vmlinux);
 
        return err;