Skip to content

Commit

Permalink
bpftool: Fix error message of strerror
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Tianyi Liu authored and Andrii Nakryiko committed Sep 30, 2022
1 parent 51e05a8 commit 3ca2fb4
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 12 deletions.
11 changes: 5 additions & 6 deletions tools/bpf/bpftool/btf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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;
}
}
Expand Down
4 changes: 2 additions & 2 deletions tools/bpf/bpftool/gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
7 changes: 3 additions & 4 deletions tools/bpf/bpftool/map_perf_ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
}
}
Expand Down

0 comments on commit 3ca2fb4

Please sign in to comment.