aboutgitcodelistschat:MatrixIRC
path: root/tests/unit/test_filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/test_filter.c')
-rw-r--r--tests/unit/test_filter.c76
1 files changed, 70 insertions, 6 deletions
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 <stdio.h>
#include <stdlib.h>
+#include <stddef.h>
+#include <fcntl.h>
#include <sys/syscall.h>
#include <sys/mman.h>
#include <sys/resource.h>
@@ -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;
}