Skip to content

Commit

Permalink
libbpf: Fix BTF data layout checks and allow empty BTF
Browse files Browse the repository at this point in the history
Make data section layout checks stricter, disallowing overlap of types and
strings data.

Additionally, allow BTFs with no type data. There is nothing inherently wrong
with having BTF with no types (put potentially with some strings). This could
be a situation with kernel module BTFs, if module doesn't introduce any new
type information.

Also fix invalid offset alignment check for btf->hdr->type_off.

Fixes: 8a138ae ("bpf: btf: Add BTF support to libbpf")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20201105043402.2530976-8-andrii@kernel.org
  • Loading branch information
Andrii Nakryiko authored and Alexei Starovoitov committed Nov 6, 2020
1 parent 1306c98 commit d812362
Showing 1 changed file with 6 additions and 10 deletions.
16 changes: 6 additions & 10 deletions tools/lib/bpf/btf.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,22 +245,18 @@ static int btf_parse_hdr(struct btf *btf)
return -EINVAL;
}

if (meta_left < hdr->type_off) {
pr_debug("Invalid BTF type section offset:%u\n", hdr->type_off);
if (meta_left < hdr->str_off + hdr->str_len) {
pr_debug("Invalid BTF total size:%u\n", btf->raw_size);
return -EINVAL;
}

if (meta_left < hdr->str_off) {
pr_debug("Invalid BTF string section offset:%u\n", hdr->str_off);
if (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;
}

if (hdr->type_off >= hdr->str_off) {
pr_debug("BTF type section offset >= string section offset. No type?\n");
return -EINVAL;
}

if (hdr->type_off & 0x02) {
if (hdr->type_off % 4) {
pr_debug("BTF type section is not aligned to 4 bytes\n");
return -EINVAL;
}
Expand Down

0 comments on commit d812362

Please sign in to comment.