libbpf: Ensure FD >= 3 during bpf_map__reuse_fd()
Improve bpf_map__reuse_fd() logic and ensure that dup'ed map FD is "good" (>= 3) and has O_CLOEXEC flags. Use fcntl(F_DUPFD_CLOEXEC) for that, similarly to ensure_good_fd() helper we already use in low-level APIs that work with bpf() syscall. Suggested-by: Lennart Poettering <lennart@poettering.net> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20230525221311.2136408-2-andrii@kernel.org
This commit is contained in:
parent
59842c5451
commit
4aadd2920b
@ -4414,18 +4414,17 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd)
|
||||
if (!new_name)
|
||||
return libbpf_err(-errno);
|
||||
|
||||
new_fd = open("/", O_RDONLY | O_CLOEXEC);
|
||||
/*
|
||||
* Like dup(), but make sure new FD is >= 3 and has O_CLOEXEC set.
|
||||
* This is similar to what we do in ensure_good_fd(), but without
|
||||
* closing original FD.
|
||||
*/
|
||||
new_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
|
||||
if (new_fd < 0) {
|
||||
err = -errno;
|
||||
goto err_free_new_name;
|
||||
}
|
||||
|
||||
new_fd = dup3(fd, new_fd, O_CLOEXEC);
|
||||
if (new_fd < 0) {
|
||||
err = -errno;
|
||||
goto err_close_new_fd;
|
||||
}
|
||||
|
||||
err = zclose(map->fd);
|
||||
if (err) {
|
||||
err = -errno;
|
||||
|
Loading…
x
Reference in New Issue
Block a user