diff options
author | Andrii Nakryiko <andrii@kernel.org> | 2021-12-14 15:20:54 -0800 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2021-12-14 21:59:33 -0800 |
commit | f97982398cc1c92f2e9bd0ef1ef870a5a729b0ac (patch) | |
tree | 6472b1652415cc9f7aee558e818b78e2c07cd366 /tools/lib | |
parent | a34efe503bc55c5732e328e5191ad549eb899f31 (diff) | |
download | linux-stable-f97982398cc1c92f2e9bd0ef1ef870a5a729b0ac.tar.gz linux-stable-f97982398cc1c92f2e9bd0ef1ef870a5a729b0ac.tar.bz2 linux-stable-f97982398cc1c92f2e9bd0ef1ef870a5a729b0ac.zip |
libbpf: Avoid reading past ELF data section end when copying license
Fix possible read beyond ELF "license" data section if the license
string is not properly zero-terminated. Use the fact that libbpf_strlcpy
never accesses the (N-1)st byte of the source string because it's
replaced with '\0' anyways.
If this happens, it's a violation of contract between libbpf and a user,
but not handling this more robustly upsets CIFuzz, so given the fix is
trivial, let's fix the potential issue.
Fixes: 9fc205b413b3 ("libbpf: Add sane strncpy alternative and use it internally")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20211214232054.3458774-1-andrii@kernel.org
Diffstat (limited to 'tools/lib')
-rw-r--r-- | tools/lib/bpf/libbpf.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 684c34ce1a26..cf862a19222b 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -1320,7 +1320,10 @@ static int bpf_object__check_endianness(struct bpf_object *obj) static int bpf_object__init_license(struct bpf_object *obj, void *data, size_t size) { - libbpf_strlcpy(obj->license, data, sizeof(obj->license)); + /* libbpf_strlcpy() only copies first N - 1 bytes, so size + 1 won't + * go over allowed ELF data section buffer + */ + libbpf_strlcpy(obj->license, data, min(size + 1, sizeof(obj->license))); pr_debug("license of %s is %s\n", obj->path, obj->license); return 0; } |