diff options
| author | Andrii Nakryiko <andriin@fb.com> | 2019-05-29 13:36:04 -0400 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-05-29 19:23:34 -0400 |
| commit | be5c5d4e9d8cbdd7fcdcbc45e86e34bc0bd1cefd (patch) | |
| tree | 792ac7428a29e496e2ce8f5622e81570fa89872d /tools/lib | |
| parent | 8ca990ce0d402d5aaf05f7a33ff025fcbcbb5f93 (diff) | |
libbpf: preserve errno before calling into user callback
pr_warning ultimately may call into user-provided callback function,
which can clobber errno value, so we need to save it before that.
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools/lib')
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index c985a7916e35..40690b7e500e 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
| @@ -565,12 +565,12 @@ static int bpf_object__elf_init(struct bpf_object *obj) | |||
| 565 | } else { | 565 | } else { |
| 566 | obj->efile.fd = open(obj->path, O_RDONLY); | 566 | obj->efile.fd = open(obj->path, O_RDONLY); |
| 567 | if (obj->efile.fd < 0) { | 567 | if (obj->efile.fd < 0) { |
| 568 | char errmsg[STRERR_BUFSIZE]; | 568 | char errmsg[STRERR_BUFSIZE], *cp; |
| 569 | char *cp = libbpf_strerror_r(errno, errmsg, | ||
| 570 | sizeof(errmsg)); | ||
| 571 | 569 | ||
| 570 | err = -errno; | ||
| 571 | cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); | ||
| 572 | pr_warning("failed to open %s: %s\n", obj->path, cp); | 572 | pr_warning("failed to open %s: %s\n", obj->path, cp); |
| 573 | return -errno; | 573 | return err; |
| 574 | } | 574 | } |
| 575 | 575 | ||
| 576 | obj->efile.elf = elf_begin(obj->efile.fd, | 576 | obj->efile.elf = elf_begin(obj->efile.fd, |
