0001
0002
0003
0004 #define _GNU_SOURCE
0005 #include <unistd.h>
0006 #include <sys/syscall.h> /* For SYS_xxx definitions */
0007 #include <sys/types.h>
0008 #include <test_progs.h>
0009 #include "task_local_storage.skel.h"
0010 #include "task_local_storage_exit_creds.skel.h"
0011 #include "task_ls_recursion.skel.h"
0012
0013 static void test_sys_enter_exit(void)
0014 {
0015 struct task_local_storage *skel;
0016 int err;
0017
0018 skel = task_local_storage__open_and_load();
0019 if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
0020 return;
0021
0022 skel->bss->target_pid = syscall(SYS_gettid);
0023
0024 err = task_local_storage__attach(skel);
0025 if (!ASSERT_OK(err, "skel_attach"))
0026 goto out;
0027
0028 syscall(SYS_gettid);
0029 syscall(SYS_gettid);
0030
0031
0032 ASSERT_EQ(skel->bss->enter_cnt, 3, "enter_cnt");
0033 ASSERT_EQ(skel->bss->exit_cnt, 3, "exit_cnt");
0034 ASSERT_EQ(skel->bss->mismatch_cnt, 0, "mismatch_cnt");
0035 out:
0036 task_local_storage__destroy(skel);
0037 }
0038
0039 static void test_exit_creds(void)
0040 {
0041 struct task_local_storage_exit_creds *skel;
0042 int err;
0043
0044 skel = task_local_storage_exit_creds__open_and_load();
0045 if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
0046 return;
0047
0048 err = task_local_storage_exit_creds__attach(skel);
0049 if (!ASSERT_OK(err, "skel_attach"))
0050 goto out;
0051
0052
0053 if (CHECK_FAIL(system("ls > /dev/null")))
0054 goto out;
0055
0056
0057 kern_sync_rcu();
0058 ASSERT_EQ(skel->bss->valid_ptr_count, 0, "valid_ptr_count");
0059 ASSERT_NEQ(skel->bss->null_ptr_count, 0, "null_ptr_count");
0060 out:
0061 task_local_storage_exit_creds__destroy(skel);
0062 }
0063
0064 static void test_recursion(void)
0065 {
0066 struct task_ls_recursion *skel;
0067 int err;
0068
0069 skel = task_ls_recursion__open_and_load();
0070 if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
0071 return;
0072
0073 err = task_ls_recursion__attach(skel);
0074 if (!ASSERT_OK(err, "skel_attach"))
0075 goto out;
0076
0077
0078 syscall(SYS_gettid);
0079
0080 out:
0081 task_ls_recursion__destroy(skel);
0082 }
0083
0084 void test_task_local_storage(void)
0085 {
0086 if (test__start_subtest("sys_enter_exit"))
0087 test_sys_enter_exit();
0088 if (test__start_subtest("exit_creds"))
0089 test_exit_creds();
0090 if (test__start_subtest("recursion"))
0091 test_recursion();
0092 }