selftests/bpf: Add test for strict BTF type check
Ensure that the edge case where first member type was matched successfully even if it didn't match BTF type of register is caught and rejected by the verifier. Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20220424214901.2743946-14-memxor@gmail.com
This commit is contained in:
parent
05a945deef
commit
792c0a345f
|
@ -550,8 +550,13 @@ struct sock * noinline bpf_kfunc_call_test3(struct sock *sk)
|
|||
return sk;
|
||||
}
|
||||
|
||||
struct prog_test_member1 {
|
||||
int a;
|
||||
};
|
||||
|
||||
struct prog_test_member {
|
||||
u64 c;
|
||||
struct prog_test_member1 m;
|
||||
int c;
|
||||
};
|
||||
|
||||
struct prog_test_ref_kfunc {
|
||||
|
@ -576,6 +581,12 @@ bpf_kfunc_call_test_acquire(unsigned long *scalar_ptr)
|
|||
return &prog_test_struct;
|
||||
}
|
||||
|
||||
noinline struct prog_test_member *
|
||||
bpf_kfunc_call_memb_acquire(void)
|
||||
{
|
||||
return &prog_test_struct.memb;
|
||||
}
|
||||
|
||||
noinline void bpf_kfunc_call_test_release(struct prog_test_ref_kfunc *p)
|
||||
{
|
||||
}
|
||||
|
@ -584,6 +595,10 @@ noinline void bpf_kfunc_call_memb_release(struct prog_test_member *p)
|
|||
{
|
||||
}
|
||||
|
||||
noinline void bpf_kfunc_call_memb1_release(struct prog_test_member1 *p)
|
||||
{
|
||||
}
|
||||
|
||||
noinline struct prog_test_ref_kfunc *
|
||||
bpf_kfunc_call_test_kptr_get(struct prog_test_ref_kfunc **p, int a, int b)
|
||||
{
|
||||
|
@ -673,8 +688,10 @@ BTF_ID(func, bpf_kfunc_call_test1)
|
|||
BTF_ID(func, bpf_kfunc_call_test2)
|
||||
BTF_ID(func, bpf_kfunc_call_test3)
|
||||
BTF_ID(func, bpf_kfunc_call_test_acquire)
|
||||
BTF_ID(func, bpf_kfunc_call_memb_acquire)
|
||||
BTF_ID(func, bpf_kfunc_call_test_release)
|
||||
BTF_ID(func, bpf_kfunc_call_memb_release)
|
||||
BTF_ID(func, bpf_kfunc_call_memb1_release)
|
||||
BTF_ID(func, bpf_kfunc_call_test_kptr_get)
|
||||
BTF_ID(func, bpf_kfunc_call_test_pass_ctx)
|
||||
BTF_ID(func, bpf_kfunc_call_test_pass1)
|
||||
|
@ -689,16 +706,19 @@ BTF_SET_END(test_sk_check_kfunc_ids)
|
|||
|
||||
BTF_SET_START(test_sk_acquire_kfunc_ids)
|
||||
BTF_ID(func, bpf_kfunc_call_test_acquire)
|
||||
BTF_ID(func, bpf_kfunc_call_memb_acquire)
|
||||
BTF_ID(func, bpf_kfunc_call_test_kptr_get)
|
||||
BTF_SET_END(test_sk_acquire_kfunc_ids)
|
||||
|
||||
BTF_SET_START(test_sk_release_kfunc_ids)
|
||||
BTF_ID(func, bpf_kfunc_call_test_release)
|
||||
BTF_ID(func, bpf_kfunc_call_memb_release)
|
||||
BTF_ID(func, bpf_kfunc_call_memb1_release)
|
||||
BTF_SET_END(test_sk_release_kfunc_ids)
|
||||
|
||||
BTF_SET_START(test_sk_ret_null_kfunc_ids)
|
||||
BTF_ID(func, bpf_kfunc_call_test_acquire)
|
||||
BTF_ID(func, bpf_kfunc_call_memb_acquire)
|
||||
BTF_ID(func, bpf_kfunc_call_test_kptr_get)
|
||||
BTF_SET_END(test_sk_ret_null_kfunc_ids)
|
||||
|
||||
|
|
|
@ -138,6 +138,26 @@
|
|||
{ "bpf_kfunc_call_memb_release", 8 },
|
||||
},
|
||||
},
|
||||
{
|
||||
"calls: invalid kfunc call: don't match first member type when passed to release kfunc",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
|
||||
BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.prog_type = BPF_PROG_TYPE_SCHED_CLS,
|
||||
.result = REJECT,
|
||||
.errstr = "kernel function bpf_kfunc_call_memb1_release args#0 expected pointer",
|
||||
.fixup_kfunc_btf_id = {
|
||||
{ "bpf_kfunc_call_memb_acquire", 1 },
|
||||
{ "bpf_kfunc_call_memb1_release", 5 },
|
||||
},
|
||||
},
|
||||
{
|
||||
"calls: invalid kfunc call: PTR_TO_BTF_ID with negative offset",
|
||||
.insns = {
|
||||
|
|
Loading…
Reference in New Issue