Skip to content

Commit

Permalink
libbpf: Fix error handling in bpf_map__reuse_fd()
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Toke Høiland-Jørgensen authored and Alexei Starovoitov committed Nov 2, 2019
1 parent 78db77f commit d1b4574
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions tools/lib/bpf/libbpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1917,16 +1917,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;
Expand All @@ -1945,7 +1951,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)
Expand Down

0 comments on commit d1b4574

Please sign in to comment.