Message ID | 20211019165801.88714-1-andrii@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | BPF |
Headers | show |
Series | [bpf] libbpf: fix overflow in BTF sanity checks | expand |
On Tue, Oct 19, 2021 at 9:58 AM <andrii.nakryiko@gmail.com> wrote: > > From: Andrii Nakryiko <andrii@kernel.org> > > btf_header's str_off+str_len or type_off+type_len can overflow as they > are u32s. This will lead to bypassing the sanity checks during BTF > parsing, resulting in crashes afterwards. Fix by using 64-bit signed > integers for comparison. > > Fixes: d8123624506c ("libbpf: Fix BTF data layout checks and allow empty BTF") > Reported-by: Evgeny Vereshchagin <evvers@ya.ru> > Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Applied.
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 1f6dea11f600..7ed117401e52 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -241,12 +241,12 @@ static int btf_parse_hdr(struct btf *btf) } meta_left = btf->raw_size - sizeof(*hdr); - if (meta_left < hdr->str_off + hdr->str_len) { + if (meta_left < (long long)hdr->str_off + hdr->str_len) { pr_debug("Invalid BTF total size:%u\n", btf->raw_size); return -EINVAL; } - if (hdr->type_off + hdr->type_len > hdr->str_off) { + if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) { pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n", hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len); return -EINVAL;