mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-28 01:43:47 -04:00
bpftool: Fix double close in map dump
map_dump() closes the map fd in its error path, and do_dump() then
closes the same fd again after a successful dump. Closing an already
closed fd leaves errno set to EBADF, which poisons later errno checks
such as the batch file read check in do_batch(). Let do_dump() own the
fd and remove the close from map_dump().
The same double-close pattern exists in do_show_subset(): both
show_map_close_json() and show_map_close_plain() already close the fd,
so drop the extra close() there as well.
Also propagate the error when bpf_map_get_info_by_fd() fails on a
subsequent map in do_dump(): set err = -1 before breaking out of the
loop, so a later failure is not silently hidden after an earlier
iteration succeeded.
Fixes: 99f9863a0c ("bpftool: Match maps by name")
Signed-off-by: Yuan Chen <chenyuan@kylinos.cn>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20260810142224.2907373-2-chenyuan_fl@163.com
This commit is contained in:
committed by
Andrii Nakryiko
parent
aacd13e1eb
commit
259d60f5bf
@@ -659,8 +659,6 @@ static int do_show_subset(int argc, char **argv)
|
||||
show_map_close_json(fds[i], &info);
|
||||
else
|
||||
show_map_close_plain(fds[i], &info);
|
||||
|
||||
close(fds[i]);
|
||||
}
|
||||
if (json_output && nb_fds > 1)
|
||||
jsonw_end_array(json_wtr); /* root array */
|
||||
@@ -895,7 +893,6 @@ map_dump(int fd, struct bpf_map_info *info, json_writer_t *wtr,
|
||||
exit_free:
|
||||
free(key);
|
||||
free(value);
|
||||
close(fd);
|
||||
free_map_kv_btf(btf);
|
||||
|
||||
return err;
|
||||
@@ -944,6 +941,7 @@ static int do_dump(int argc, char **argv)
|
||||
for (i = 0; i < nb_fds; i++) {
|
||||
if (bpf_map_get_info_by_fd(fds[i], &info, &len)) {
|
||||
p_err("can't get map info: %s", strerror(errno));
|
||||
err = -1;
|
||||
break;
|
||||
}
|
||||
err = map_dump(fds[i], &info, wtr, nb_fds > 1);
|
||||
|
||||
Reference in New Issue
Block a user