diff options
author | Andrii Nakryiko <andriin@fb.com> | 2019-08-01 03:24:05 -0400 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2019-08-01 16:10:45 -0400 |
commit | 3415ec643e7bd644b03026efbe2f2b36cbe9b34b (patch) | |
tree | 61ba0d59447f209b532a7a5481c202209d75d278 | |
parent | 56fbc24116f458a0ea48f9f37fe770fd791042d9 (diff) |
libbpf: set BTF FD for prog only when there is supported .BTF.ext data
5d01ab7bac46 ("libbpf: fix erroneous multi-closing of BTF FD")
introduced backwards-compatibility issue, manifesting itself as -E2BIG
error returned on program load due to unknown non-zero btf_fd attribute
value for BPF_PROG_LOAD sys_bpf() sub-command.
This patch fixes bug by ensuring that we only ever associate BTF FD with
program if there is a BTF.ext data that was successfully loaded into
kernel, which automatically means kernel supports func_info/line_info
and associated BTF FD for progs (checked and ensured also by BTF
sanitization code).
Fixes: 5d01ab7bac46 ("libbpf: fix erroneous multi-closing of BTF FD")
Reported-by: Andrey Ignatov <rdna@fb.com>
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-rw-r--r-- | tools/lib/bpf/libbpf.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 2e84fa5b8479..2b57d7ea7836 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
@@ -2472,7 +2472,11 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, | |||
2472 | load_attr.license = license; | 2472 | load_attr.license = license; |
2473 | load_attr.kern_version = kern_version; | 2473 | load_attr.kern_version = kern_version; |
2474 | load_attr.prog_ifindex = prog->prog_ifindex; | 2474 | load_attr.prog_ifindex = prog->prog_ifindex; |
2475 | btf_fd = bpf_object__btf_fd(prog->obj); | 2475 | /* if .BTF.ext was loaded, kernel supports associated BTF for prog */ |
2476 | if (prog->obj->btf_ext) | ||
2477 | btf_fd = bpf_object__btf_fd(prog->obj); | ||
2478 | else | ||
2479 | btf_fd = -1; | ||
2476 | load_attr.prog_btf_fd = btf_fd >= 0 ? btf_fd : 0; | 2480 | load_attr.prog_btf_fd = btf_fd >= 0 ? btf_fd : 0; |
2477 | load_attr.func_info = prog->func_info; | 2481 | load_attr.func_info = prog->func_info; |
2478 | load_attr.func_info_rec_size = prog->func_info_rec_size; | 2482 | load_attr.func_info_rec_size = prog->func_info_rec_size; |