On 2/9/22 4:36 PM, Delyan Kratunov wrote:
As reported in [0], kernel and userspace can sometimes disagree on the definition of a typedef (in particular, the size). This leads to trouble when userspace maps the memory of a bpf program and reads/writes to it assuming a different memory layout.
I am thinking whether we can do better since this only resolved some basic types. But it is totally possible some types in vmlinux.h, who are kernel internal types, happen in some uapi or user header as well but with different sizes. Currently, the exposed bpf program types (in skeleton) are all from global variables. Since we intend to ensure their size be equal, and bpf program itself provides the size of the type. For example, in bpf program, we have following, TypeA variable; Since TypeA will appear in the skel.h file, user must define it somehow before skel.h. Let us say TypeA size is 20 from bpf program BTF type. So we could insert a BUILD_BUG_ON(sizeof(TypeA) != 20) in the skeleton file to ensure the size match and this applies to all types. In the skel.h file, we can have #ifndef BUILD_BUG_ON #define BUILD_BUG_ON ... #endif to have BUILD_BUG_ON to cause compilation error if the condition is true. User can define BUILD_BUG_ON before skel.h if they want to override. This should apply to all types put in bss/data/rodata sections by skeleton. If this indeed happens as in [0], user can detect the problem and they may look at vmlinux.h and use proper underlying types to resolve the issue. WDYT?
This series resolves most int-like typedefs and rewrites them as standard int16_t-like types. In particular, we don't touch __u32-like types, char, and _Bool, as changing them changes cast semantics and would break too many pre-existing programs. For example, int8_t* is not convertible to char* because int8_t is explicitly signed. [0]: https://github.com/iovisor/bcc/pull/3777 Delyan Kratunov (3): libbpf: btf_dump can produce explicitly sized ints bpftool: skeleton uses explicitly sized ints selftests/bpf: add test case for userspace and bpf type size mismatch tools/bpf/bpftool/gen.c | 3 + tools/lib/bpf/btf.h | 4 +- tools/lib/bpf/btf_dump.c | 80 ++++++++++++++++++- .../selftests/bpf/prog_tests/skeleton.c | 22 +++-- .../selftests/bpf/progs/test_skeleton.c | 8 ++ 5 files changed, 107 insertions(+), 10 deletions(-) -- 2.34.1