For kernel functions, even if a function parameter is not of u64 size, it may still be cast to a data type of u64 size. In fact, page_cnt, a u32 argument in bpf_arena_reserve_pages() kfunc is implicitly getting typecasted to long. Without zero extension for that argument, the verifier_arena/reserve_invalid_region selftest fails on ppc64le. So, be more conservative and do zero extension for all arguments. JIT compile code can eliminate unnecessary zero extension code-gen. Fixes: e6ac2450d6de ("bpf: Support bpf program calling kernel function") Reported-by: Saket Kumar Bhaskar Signed-off-by: Hari Bathini --- kernel/bpf/verifier.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index f0ca69f888fa..3f6e0e1c71e4 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -12018,8 +12018,11 @@ static void __mark_btf_func_reg_size(struct bpf_verifier_env *env, struct bpf_re /* Function return value */ reg->subreg_def = reg_size == sizeof(u64) ? DEF_NOT_SUBREG : env->insn_idx + 1; - } else if (reg_size == sizeof(u64)) { - /* Function argument */ + } else { + /* + * Be more conservative and do zero extension for all arguments, + * as how these arguments get used in kernel is anybody's guess. + */ mark_insn_zext(env, reg); } } -- 2.53.0