Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (c) 2021 Facebook */
0003 
0004 #define _GNU_SOURCE         /* See feature_test_macros(7) */
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     /* 3x syscalls: 1x attach and 2x gettid */
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     /* trigger at least one exit_creds() */
0053     if (CHECK_FAIL(system("ls > /dev/null")))
0054         goto out;
0055 
0056     /* sync rcu to make sure exit_creds() is called for "ls" */
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     /* trigger sys_enter, make sure it does not cause deadlock */
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 }