| From 96e54c1ac5b8cfc86511826c6827f718d7f9a043 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@redhat.com> |
| Date: Sat, 2 Nov 2019 12:09:37 +0100 |
| Subject: [PATCH] libbpf: Fix error handling in bpf_map__reuse_fd() |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit d1b4574a4b86565325ef2e545eda8dfc9aa07c60 upstream. |
| |
| bpf_map__reuse_fd() was calling close() in the error path before returning |
| an error value based on errno. However, close can change errno, so that can |
| lead to potentially misleading error messages. Instead, explicitly store |
| errno in the err variable before each goto. |
| |
| Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Acked-by: Andrii Nakryiko <andriin@fb.com> |
| Link: https://lore.kernel.org/bpf/157269297769.394725.12634985106772698611.stgit@toke.dk |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c |
| index 0ccf6aa533ae..88d506951b07 100644 |
| --- a/tools/lib/bpf/libbpf.c |
| +++ b/tools/lib/bpf/libbpf.c |
| @@ -1503,16 +1503,22 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd) |
| return -errno; |
| |
| new_fd = open("/", O_RDONLY | O_CLOEXEC); |
| - if (new_fd < 0) |
| + if (new_fd < 0) { |
| + err = -errno; |
| goto err_free_new_name; |
| + } |
| |
| new_fd = dup3(fd, new_fd, O_CLOEXEC); |
| - if (new_fd < 0) |
| + if (new_fd < 0) { |
| + err = -errno; |
| goto err_close_new_fd; |
| + } |
| |
| err = zclose(map->fd); |
| - if (err) |
| + if (err) { |
| + err = -errno; |
| goto err_close_new_fd; |
| + } |
| free(map->name); |
| |
| map->fd = new_fd; |
| @@ -1531,7 +1537,7 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd) |
| close(new_fd); |
| err_free_new_name: |
| free(new_name); |
| - return -errno; |
| + return err; |
| } |
| |
| int bpf_map__resize(struct bpf_map *map, __u32 max_entries) |
| -- |
| 2.7.4 |
| |