From: Feng Yang Add selftests for verifying return values of fmod_ret. test_progs -t verifier_fmod_ret_return 569/1 verifier_fmod_ret_return/fmod_task_alloc_1:OK 569/2 verifier_fmod_ret_return/fmod_task_alloc_2:OK 569/3 verifier_fmod_ret_return/fmod_ret_sys_open_1:OK 569/4 verifier_fmod_ret_return/fmod_ret_sys_open_2:OK 569/5 verifier_fmod_ret_return/fmod_ret_sys_open_3:OK 569/6 verifier_fmod_ret_return/fmod_page_pool_alloc_netmems_1:OK 569/7 verifier_fmod_ret_return/fmod_page_pool_alloc_netmems_2:OK 569 verifier_fmod_ret_return:OK Summary: 1/7 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Feng Yang --- .../selftests/bpf/prog_tests/verifier.c | 2 + .../bpf/progs/verifier_fmod_ret_return.c | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/verifier_fmod_ret_return.c diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c b/tools/testing/selftests/bpf/prog_tests/verifier.c index 169cf7fbf40f..6e67f69d88fa 100644 --- a/tools/testing/selftests/bpf/prog_tests/verifier.c +++ b/tools/testing/selftests/bpf/prog_tests/verifier.c @@ -37,6 +37,7 @@ #include "verifier_div0.skel.h" #include "verifier_div_mod_bounds.skel.h" #include "verifier_div_overflow.skel.h" +#include "verifier_fmod_ret_return.skel.h" #include "verifier_global_subprogs.skel.h" #include "verifier_global_ptr_args.skel.h" #include "verifier_gotol.skel.h" @@ -184,6 +185,7 @@ void test_verifier_direct_stack_access_wraparound(void) { RUN(verifier_direct_st void test_verifier_div0(void) { RUN(verifier_div0); } void test_verifier_div_mod_bounds(void) { RUN(verifier_div_mod_bounds); } void test_verifier_div_overflow(void) { RUN(verifier_div_overflow); } +void test_verifier_fmod_ret_return(void) { RUN(verifier_fmod_ret_return); } void test_verifier_global_subprogs(void) { RUN(verifier_global_subprogs); } void test_verifier_global_ptr_args(void) { RUN(verifier_global_ptr_args); } void test_verifier_gotol(void) { RUN(verifier_gotol); } diff --git a/tools/testing/selftests/bpf/progs/verifier_fmod_ret_return.c b/tools/testing/selftests/bpf/progs/verifier_fmod_ret_return.c new file mode 100644 index 000000000000..11d303b01c80 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/verifier_fmod_ret_return.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include "bpf_misc.h" + +SEC("fmod_ret/security_task_alloc") +__success +int BPF_PROG(fmod_task_alloc_1) +{ + return -1; +} + +SEC("fmod_ret/security_task_alloc") +__failure __log_level(2) +__msg("At program exit the register R0 has smin=1 smax=1 should have been in [-4095, 0]") +int BPF_PROG(fmod_task_alloc_2) +{ + return 1; +} + +SEC("fmod_ret/" SYS_PREFIX "sys_open") +__failure __log_level(2) +__msg("At program exit the register R0 has smin=0 smax=0 should have been in [-4095, -1]") +int BPF_PROG(fmod_ret_sys_open_1) +{ + return 0; +} + +SEC("fmod_ret/" SYS_PREFIX "sys_open") +__failure __log_level(2) +__msg("At program exit the register R0 has smin=1 smax=1 should have been in [-4095, -1]") +int BPF_PROG(fmod_ret_sys_open_2) +{ + return 1; +} + +SEC("fmod_ret/" SYS_PREFIX "sys_open") +__success +int BPF_PROG(fmod_ret_sys_open_3) +{ + return -1; +} + +SEC("fmod_ret/page_pool_alloc_netmems") +__failure __log_level(2) +__msg("At program exit the register R0 has smin=1 smax=1 should have been in [0, 0]") +int BPF_PROG(fmod_page_pool_alloc_netmems_1) +{ + return 1; +} + +SEC("fmod_ret/page_pool_alloc_netmems") +__success +int BPF_PROG(fmod_page_pool_alloc_netmems_2) +{ + return 0; +} + +char _license[] SEC("license") = "GPL"; -- 2.43.0