Tejun reported a bpf program kfunc return value mis-handling which may cause incorrect result. If the kfunc return value is boolean or u8, the bpf program produce incorrect results. The main reason is due to mismatch of return value expectation between native architecture and bpf. For example, for x86_64, if a kfunc returns a u8, the kfunc returns 64-bit %rax, the top 56 bits might be garbage. This is okay if the caller is x86_64 as the caller can use special instruction to access lower 8-bit register %al. But this will cause a problem for bpf program since bpf program assumes the whole r0 register should contain correct value. This patch set fixed the issue by doing necessary zero/sign extension for the kfunc return value to meet bpf requirement. For the rest of patches, Patch 1 is a preparation patch. Patch 2 implemented kernel support to perform necessary zero/sign extension for kfunc return value. Patch 3 added two tests, one with return type u8 and another with s16. Yonghong Song (3): bpf: Always return corresponding btf_type in __get_type_size() bpf: Perform necessary sign/zero extension for kfunc return values selftests/bpf: Add tests with u8/s16 kfunc return types include/linux/bpf.h | 2 ++ kernel/bpf/btf.c | 18 +++++++--- kernel/bpf/verifier.c | 35 +++++++++++++++++-- net/bpf/test_run.c | 12 +++++++ .../selftests/bpf/prog_tests/kfunc_call.c | 10 ++++++ .../selftests/bpf/progs/kfunc_call_test.c | 32 +++++++++++++++++ 6 files changed, 102 insertions(+), 7 deletions(-) -- 2.30.2