bpftool: Fix a leak of btf object
When testing a map has btf or not, maps_have_btf() tests it by actually
getting a btf_fd from sys_bpf(BPF_BTF_GET_FD_BY_ID). However, it
forgot to btf__free() it.
In maps_have_btf() stage, there is no need to test it by really
calling sys_bpf(BPF_BTF_GET_FD_BY_ID). Testing non zero
info.btf_id is good enough.
Also, the err_close case is unnecessary, and also causes double
close() because the calling func do_dump() will close() all fds again.
Fixes: 99f9863a0c
("bpftool: Match maps by name")
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Cc: Paul Chaignon <paul.chaignon@orange.com>
Link: https://lore.kernel.org/bpf/20200115230019.1101352-1-kafai@fb.com
This commit is contained in:
Родитель
990bca1fc8
Коммит
d7de72674a
|
@ -915,32 +915,20 @@ static int maps_have_btf(int *fds, int nb_fds)
|
||||||
{
|
{
|
||||||
struct bpf_map_info info = {};
|
struct bpf_map_info info = {};
|
||||||
__u32 len = sizeof(info);
|
__u32 len = sizeof(info);
|
||||||
struct btf *btf = NULL;
|
|
||||||
int err, i;
|
int err, i;
|
||||||
|
|
||||||
for (i = 0; i < nb_fds; i++) {
|
for (i = 0; i < nb_fds; i++) {
|
||||||
err = bpf_obj_get_info_by_fd(fds[i], &info, &len);
|
err = bpf_obj_get_info_by_fd(fds[i], &info, &len);
|
||||||
if (err) {
|
if (err) {
|
||||||
p_err("can't get map info: %s", strerror(errno));
|
p_err("can't get map info: %s", strerror(errno));
|
||||||
goto err_close;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = btf__get_from_id(info.btf_id, &btf);
|
if (!info.btf_id)
|
||||||
if (err) {
|
|
||||||
p_err("failed to get btf");
|
|
||||||
goto err_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!btf)
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
err_close:
|
|
||||||
for (; i < nb_fds; i++)
|
|
||||||
close(fds[i]);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Загрузка…
Ссылка в новой задаче