bpftool: Fix error message of strerror
authorTianyi Liu <i.pear@outlook.com>
Wed, 28 Sep 2022 08:09:32 +0000 (16:09 +0800)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 30 Sep 2022 22:40:46 +0000 (15:40 -0700)
strerror() expects a positive errno, however variable err will never be
positive when an error occurs. This causes bpftool to output too many
"unknown error", even a simple "file not exist" error can not get an
accurate message.

This patch fixed all "strerror(err)" patterns in bpftool.
Specially in btf.c#L823, hashmap__append() is an internal function of
libbpf and will not change errno, so there's a little difference.
Some libbpf_get_error() calls are kept for return values.

Changes since v1: https://lore.kernel.org/bpf/SY4P282MB1084B61CD8671DFA395AA8579D539@SY4P282MB1084.AUSP282.PROD.OUTLOOK.COM/
Check directly for NULL values instead of calling libbpf_get_error().

Signed-off-by: Tianyi Liu <i.pear@outlook.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Reviewed-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/SY4P282MB1084AD9CD84A920F08DF83E29D549@SY4P282MB1084.AUSP282.PROD.OUTLOOK.COM
tools/bpf/bpftool/btf.c
tools/bpf/bpftool/gen.c
tools/bpf/bpftool/map_perf_ring.c

index 64411fe49a663d72b61be1041ed99dd5502fbea0..68a70ac03c80ac9aa8fd8020f750f0ed6641a1fd 100644 (file)
@@ -635,10 +635,9 @@ static int do_dump(int argc, char **argv)
 
                btf = btf__parse_split(*argv, base ?: base_btf);
                err = libbpf_get_error(btf);
-               if (err) {
-                       btf = NULL;
+               if (!btf) {
                        p_err("failed to load BTF from %s: %s",
-                             *argv, strerror(err));
+                             *argv, strerror(errno));
                        goto done;
                }
                NEXT_ARG();
@@ -683,8 +682,8 @@ static int do_dump(int argc, char **argv)
 
                btf = btf__load_from_kernel_by_id_split(btf_id, base_btf);
                err = libbpf_get_error(btf);
-               if (err) {
-                       p_err("get btf by id (%u): %s", btf_id, strerror(err));
+               if (!btf) {
+                       p_err("get btf by id (%u): %s", btf_id, strerror(errno));
                        goto done;
                }
        }
@@ -820,7 +819,7 @@ build_btf_type_table(struct hashmap *tab, enum bpf_obj_type type,
                                      u32_as_hash_field(id));
                if (err) {
                        p_err("failed to append entry to hashmap for BTF ID %u, object ID %u: %s",
-                             btf_id, id, strerror(errno));
+                             btf_id, id, strerror(-err));
                        goto err_free;
                }
        }
index 7070dcffa822461ecde1fef4b86be4012dcb725c..cf8b4e525c889cf17bc1a61bed1c0768816b76d5 100644 (file)
@@ -1594,14 +1594,14 @@ static int do_object(int argc, char **argv)
 
                err = bpf_linker__add_file(linker, file, NULL);
                if (err) {
-                       p_err("failed to link '%s': %s (%d)", file, strerror(err), err);
+                       p_err("failed to link '%s': %s (%d)", file, strerror(errno), errno);
                        goto out;
                }
        }
 
        err = bpf_linker__finalize(linker);
        if (err) {
-               p_err("failed to finalize ELF file: %s (%d)", strerror(err), err);
+               p_err("failed to finalize ELF file: %s (%d)", strerror(errno), errno);
                goto out;
        }
 
index 1583281d1327e5270ed5885d5ed1fe1f60440430..21d7d447e1f3b2db3740629efc877f52306cb141 100644 (file)
@@ -188,10 +188,9 @@ int do_event_pipe(int argc, char **argv)
        opts.map_keys = &ctx.idx;
        pb = perf_buffer__new_raw(map_fd, MMAP_PAGE_CNT, &perf_attr,
                                  print_bpf_output, &ctx, &opts);
-       err = libbpf_get_error(pb);
-       if (err) {
+       if (!pb) {
                p_err("failed to create perf buffer: %s (%d)",
-                     strerror(err), err);
+                     strerror(errno), errno);
                goto err_close_map;
        }
 
@@ -206,7 +205,7 @@ int do_event_pipe(int argc, char **argv)
                err = perf_buffer__poll(pb, 200);
                if (err < 0 && err != -EINTR) {
                        p_err("perf buffer polling failed: %s (%d)",
-                             strerror(err), err);
+                             strerror(errno), errno);
                        goto err_close_pb;
                }
        }