From 1122b45dfdef5da534cb18da7cb9c688f9a2b528 Mon Sep 17 00:00:00 2001 From: Alice Frosi Date: Wed, 5 Apr 2023 16:35:08 +0200 Subject: Add support for 64 bits arguments --- tests/unit/test_filter.c | 76 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 6 deletions(-) (limited to 'tests/unit/test_filter.c') diff --git a/tests/unit/test_filter.c b/tests/unit/test_filter.c index c1e0949..4d7c9d8 100644 --- a/tests/unit/test_filter.c +++ b/tests/unit/test_filter.c @@ -6,6 +6,8 @@ #define _GNU_SOURCE #include #include +#include +#include #include #include #include @@ -29,14 +31,26 @@ static int generate_install_filter(struct args_target *at) unsigned int size; for (i = 0; i < 6; i++) { - if (at->args[i] != NULL) { - calls[0].args[i] = (int)at->args[i]; - calls[0].check_arg[i] = true; - } else { - calls[0].check_arg[i] = false; + if (at->args[i] == NULL) { + calls[0].args[i].type = NO_CHECK; + continue; + } + switch (at->arg_type[i]) { + case U32: + calls[0].args[i].value.v32 = (uint32_t)at->args[i]; + calls[0].args[i].type = U32; + break; + case U64: + calls[0].args[i].value.v64 = (uint64_t)at->args[i]; + calls[0].args[i].type = U64; + break; + case NO_CHECK: + calls[0].args[i].type = NO_CHECK; + break; } } size = create_bfp_program(table, filter, 1); + bpf_disasm_all(filter, size); return install_filter(filter, size); } @@ -46,6 +60,7 @@ START_TEST(no_args) MAP_SHARED | MAP_ANONYMOUS, -1, 0); at->check_fd = false; at->nr = __NR_getpid; + set_args_no_check(at); at->install_filter = generate_install_filter; setup(); mock_syscall_target(); @@ -59,7 +74,9 @@ START_TEST(with_getsid) MAP_SHARED | MAP_ANONYMOUS, -1, 0); at->check_fd = false; at->nr = __NR_getsid; + set_args_no_check(at); at->args[0] = &id; + at->arg_type[0] = U32; at->install_filter = generate_install_filter; setup(); mock_syscall_target(); @@ -74,19 +91,59 @@ START_TEST(with_getpriority) MAP_SHARED | MAP_ANONYMOUS, -1, 0); at->check_fd = false; at->nr = __NR_getpriority; + set_args_no_check(at); at->args[0] = &which; + at->arg_type[0] = U32; at->args[1] = &who; + at->arg_type[0] = U32; + at->install_filter = generate_install_filter; + setup(); + mock_syscall_target(); +} +END_TEST + +static int target_lseek() +{ + int fd = open("/dev/zero", O_RDWR); + + /* Open the device on the target, but the arg0 isn't in the filter */ + ck_assert_int_ge(fd, 0); + at->args[0] = fd; + return target(); +} + +static void test_lseek(off_t offset) +{ + at = mmap(NULL, sizeof(struct args_target), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + at->check_fd = false; + at->nr = __NR_lseek; + at->target = target_lseek; + set_args_no_check(at); + at->args[1] = offset; + at->arg_type[1] = U64; at->install_filter = generate_install_filter; setup(); mock_syscall_target(); } + +START_TEST(with_lseek_lo) +{ + test_lseek(0x1); +} +END_TEST + +START_TEST(with_lseek_hi) +{ + test_lseek(0x0000000100000000); +} END_TEST Suite *op_call_suite(void) { Suite *s; int timeout = 30; - TCase *simple, *args32; + TCase *simple, *args32, *args64; s = suite_create("Test filter with target"); @@ -103,6 +160,13 @@ Suite *op_call_suite(void) tcase_add_test(args32, with_getpriority); suite_add_tcase(s, args32); + args64 = tcase_create("with args 64 bit"); + tcase_add_checked_fixture(args64, NULL, teardown); + tcase_set_timeout(args32, timeout); + tcase_add_test(args64, with_lseek_lo); + tcase_add_test(args64, with_lseek_hi); + suite_add_tcase(s, args64); + return s; } -- cgit v1.2.3