linux/tools/lib/bpf
Andrii Nakryiko 06096d19ee libbpf: fix LDX/STX/ST CO-RE relocation size adjustment logic
Libbpf has a somewhat obscure feature of automatically adjusting the
"size" of LDX/STX/ST instruction (memory store and load instructions),
based on originally recorded access size (u8, u16, u32, or u64) and the
actual size of the field on target kernel. This is meant to facilitate
using BPF CO-RE on 32-bit architectures (pointers are always 64-bit in
BPF, but host kernel's BTF will have it as 32-bit type), as well as
generally supporting safe type changes (unsigned integer type changes
can be transparently "relocated").

One issue that surfaced only now, 5 years after this logic was
implemented, is how this all works when dealing with fields that are
arrays. This isn't all that easy and straightforward to hit (see
selftests that reproduce this condition), but one of sched_ext BPF
programs did hit it with innocent looking loop.

Long story short, libbpf used to calculate entire array size, instead of
making sure to only calculate array's element size. But it's the element
that is loaded by LDX/STX/ST instructions (1, 2, 4, or 8 bytes), so
that's what libbpf should check. This patch adjusts the logic for
arrays and fixed the issue.

Reported-by: Emil Tsalapatis <emil@etsalapatis.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250207014809.1573841-1-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2025-02-14 19:58:05 -08:00
..
.gitignore tools build: Correct bpf fixdep dependencies 2024-08-05 12:19:48 -03:00
bpf_core_read.h bpf: Avoid uninitialized value in BPF_CORE_READ_BITFIELD 2024-05-08 15:00:55 -07:00
bpf_endian.h
bpf_gen_internal.h libbpf: Support creating light skeleton of either endianness 2024-10-03 17:47:36 -07:00
bpf_helpers.h libbpf: define __uptr. 2024-10-24 10:25:59 -07:00
bpf_prog_linfo.c
bpf_tracing.h libbpf: Fix some typos in comments 2024-09-09 16:05:40 -07:00
bpf.c libbpf: prog load: Allow to use fd_array_cnt 2024-12-13 14:48:39 -08:00
bpf.h libbpf: prog load: Allow to use fd_array_cnt 2024-12-13 14:48:39 -08:00
btf_dump.c libbpf: Check the kflag of type tags in btf_dump 2025-02-05 16:17:59 -08:00
btf_iter.c libbpf,bpf: Share BTF relocate-related code with kernel 2024-06-21 14:45:07 -07:00
btf_relocate.c libbpf: Fix incorrect traversal end type ID when marking BTF_IS_EMBEDDED 2025-01-16 15:34:18 -08:00
btf.c libbpf: Introduce kflag for type_tags and decl_tags in BTF 2025-02-05 16:17:59 -08:00
btf.h libbpf: Introduce kflag for type_tags and decl_tags in BTF 2025-02-05 16:17:59 -08:00
Build libbpf: Split field iter code into its own file kernel 2024-06-21 14:45:07 -07:00
elf.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
features.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
gen_loader.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
hashmap.c
hashmap.h libbpf: Fix possible compiler warnings in hashmap 2024-10-11 12:36:59 -07:00
libbpf_common.h libbpf: Fix potential uninitialized tail padding with LIBBPF_OPTS_RESET 2023-11-09 19:07:51 -08:00
libbpf_errno.c libbpf: Optimized return value in libbpf_strerror when errno is libbpf errno 2022-12-14 18:39:33 +01:00
libbpf_internal.h libbpf: Support opening bpf objects of either endianness 2024-10-03 17:47:36 -07:00
libbpf_legacy.h libbpf: Fix some typos in comments 2024-09-09 16:05:40 -07:00
libbpf_probes.c bpf: improve error message for unsupported helper 2024-03-28 18:30:53 -07:00
libbpf_version.h libbpf: start v1.6 development cycle 2024-10-29 13:42:52 -07:00
libbpf.c libbpf: Work around kernel inconsistently stripping '.llvm.' suffix 2025-01-17 15:16:56 +01:00
libbpf.h libbpf: Add unique_match option for multi kprobe 2025-01-10 13:11:42 -08:00
libbpf.map libbpf: Introduce kflag for type_tags and decl_tags in BTF 2025-02-05 16:17:59 -08:00
libbpf.pc.template
linker.c libbpf: Extend linker API to support in-memory ELF files 2024-12-12 15:16:53 -08:00
Makefile libbpf: Add missing per-arch include path 2024-10-07 20:20:55 -07:00
netlink.c libbpf: Use OPTS_SET() macro in bpf_xdp_query() 2024-02-06 09:51:26 -08:00
nlattr.c libbpf: Fix alen calculation in libbpf_nla_dump_errormsg() 2023-02-10 15:27:22 -08:00
nlattr.h libbpf: add API to get XDP/XSK supported features 2023-02-02 20:48:24 -08:00
relo_core.c libbpf: fix LDX/STX/ST CO-RE relocation size adjustment logic 2025-02-14 19:58:05 -08:00
relo_core.h
ringbuf.c libbpf: Stringify errno in log messages in the remaining code 2024-11-11 20:29:45 -08:00
skel_internal.h libbpf: Support creating light skeleton of either endianness 2024-10-03 17:47:36 -07:00
str_error.c libbpf: Introduce errstr() for stringifying errno 2024-11-11 20:29:20 -08:00
str_error.h libbpf: Introduce errstr() for stringifying errno 2024-11-11 20:29:20 -08:00
strset.c
strset.h
usdt.bpf.h libbpf: fix some typos in libbpf 2024-09-05 13:07:47 -07:00
usdt.c libbpf: don't adjust USDT semaphore address if .stapsdt.base addr is missing 2024-12-02 08:41:17 -08:00
zip.c libbpf: Remove unneeded semicolon 2024-10-03 17:47:35 -07:00
zip.h libbpf: Implement basic zip archive parsing support 2023-03-01 16:05:34 -08:00