Commit 5245dafe authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov

libbpf: Fix overflow in BTF sanity checks

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: d8123624 ("libbpf: Fix BTF data layout checks and allow empty BTF")
Reported-by: default avatarEvgeny Vereshchagin <evvers@ya.ru>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211023003157.726961-1-andrii@kernel.org
parent 1c508843
...@@ -241,12 +241,12 @@ static int btf_parse_hdr(struct btf *btf) ...@@ -241,12 +241,12 @@ static int btf_parse_hdr(struct btf *btf)
} }
meta_left = btf->raw_size - sizeof(*hdr); 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); pr_debug("Invalid BTF total size:%u\n", btf->raw_size);
return -EINVAL; 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", 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); hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment