]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
libbpf: Fix error handling in bpf_map__reuse_fd()
authorToke Høiland-Jørgensen <toke@redhat.com>
Sat, 2 Nov 2019 11:09:37 +0000 (12:09 +0100)
committerKhalid Elmously <khalid.elmously@canonical.com>
Wed, 29 Jan 2020 04:58:30 +0000 (23:58 -0500)
BugLink: https://bugs.launchpad.net/bugs/1860490
[ Upstream commit d1b4574a4b86565325ef2e545eda8dfc9aa07c60 ]

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: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
tools/lib/bpf/libbpf.c

index 2b57d7ea78363a7c36da5540d67ff985a5e40963..244ba1db197e6c14d7da2a85648dde6ddd840948 100644 (file)
@@ -1889,16 +1889,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;
@@ -1917,7 +1923,7 @@ err_close_new_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)