selftests/bpf: Add verifier test for d_path helper
Adding verifier test for attaching tracing program and calling d_path helper from within and testing that it's allowed for dentry_open function and denied for 'd_path' function with appropriate error. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200825192124.710397-13-jolsa@kernel.org
This commit is contained in:
parent
68a26bc792
commit
762f851568
|
@ -114,6 +114,7 @@ struct bpf_test {
|
|||
bpf_testdata_struct_t retvals[MAX_TEST_RUNS];
|
||||
};
|
||||
enum bpf_attach_type expected_attach_type;
|
||||
const char *kfunc;
|
||||
};
|
||||
|
||||
/* Note we want this to be 64 bit aligned so that the end of our array is
|
||||
|
@ -984,8 +985,24 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
|
|||
attr.log_level = 4;
|
||||
attr.prog_flags = pflags;
|
||||
|
||||
if (prog_type == BPF_PROG_TYPE_TRACING && test->kfunc) {
|
||||
attr.attach_btf_id = libbpf_find_vmlinux_btf_id(test->kfunc,
|
||||
attr.expected_attach_type);
|
||||
if (attr.attach_btf_id < 0) {
|
||||
printf("FAIL\nFailed to find BTF ID for '%s'!\n",
|
||||
test->kfunc);
|
||||
(*errors)++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fd_prog = bpf_load_program_xattr(&attr, bpf_vlog, sizeof(bpf_vlog));
|
||||
if (fd_prog < 0 && !bpf_probe_prog_type(prog_type, 0)) {
|
||||
|
||||
/* BPF_PROG_TYPE_TRACING requires more setup and
|
||||
* bpf_probe_prog_type won't give correct answer
|
||||
*/
|
||||
if (fd_prog < 0 && prog_type != BPF_PROG_TYPE_TRACING &&
|
||||
!bpf_probe_prog_type(prog_type, 0)) {
|
||||
printf("SKIP (unsupported program type %d)\n", prog_type);
|
||||
skips++;
|
||||
goto close_fds;
|
||||
|
|
37
tools/testing/selftests/bpf/verifier/d_path.c
Normal file
37
tools/testing/selftests/bpf/verifier/d_path.c
Normal file
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"d_path accept",
|
||||
.insns = {
|
||||
BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
BPF_MOV64_IMM(BPF_REG_6, 0),
|
||||
BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0),
|
||||
BPF_LD_IMM64(BPF_REG_3, 8),
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_d_path),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.result = ACCEPT,
|
||||
.prog_type = BPF_PROG_TYPE_TRACING,
|
||||
.expected_attach_type = BPF_TRACE_FENTRY,
|
||||
.kfunc = "dentry_open",
|
||||
},
|
||||
{
|
||||
"d_path reject",
|
||||
.insns = {
|
||||
BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 0),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
BPF_MOV64_IMM(BPF_REG_6, 0),
|
||||
BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0),
|
||||
BPF_LD_IMM64(BPF_REG_3, 8),
|
||||
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_d_path),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.errstr = "helper call is not allowed in probe",
|
||||
.result = REJECT,
|
||||
.prog_type = BPF_PROG_TYPE_TRACING,
|
||||
.expected_attach_type = BPF_TRACE_FENTRY,
|
||||
.kfunc = "d_path",
|
||||
},
|
Loading…
Reference in a new issue