On Thu, Aug 13, 2020 at 7:29 AM Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > > Turns out there were a few more instances where libbpf didn't save the > errno before writing an error message, causing errno to be overridden by > the printf() return and the error disappearing if logging is enabled. > > Signed-off-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> > --- Acked-by: Andrii Nakryiko <andriin@xxxxxx> > tools/lib/bpf/libbpf.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 0a06124f7999..fd256440e233 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -3478,10 +3478,11 @@ bpf_object__probe_global_data(struct bpf_object *obj) > > map = bpf_create_map_xattr(&map_attr); > if (map < 0) { > - cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); > + ret = -errno; > + cp = libbpf_strerror_r(-ret, errmsg, sizeof(errmsg)); fyi, libbpf_strerror_r() is smart enough to work with both negative and positive error numbers (it basically takes abs(err)), so no need to ensure it's positive here and below. > pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", > - __func__, cp, errno); > - return -errno; > + __func__, cp, -ret); > + return ret; > } > > insns[0].imm = map; > @@ -6012,9 +6013,10 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path, > } > > if (bpf_obj_pin(prog->instances.fds[instance], path)) { > - cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); > + err = -errno; > + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); > pr_warn("failed to pin program: %s\n", cp); > - return -errno; > + return err; > } > pr_debug("pinned program '%s'\n", path); > > -- > 2.28.0 >