1*e3723e1fSApple OSS Distributions #include <stdio.h> 2*e3723e1fSApple OSS Distributions #include <mach/mach_vm.h> 3*e3723e1fSApple OSS Distributions #include <mach/mach_port.h> 4*e3723e1fSApple OSS Distributions #include <mach/mach_error.h> 5*e3723e1fSApple OSS Distributions #include <sys/sysctl.h> 6*e3723e1fSApple OSS Distributions #include <sys/wait.h> 7*e3723e1fSApple OSS Distributions #include <unistd.h> 8*e3723e1fSApple OSS Distributions 9*e3723e1fSApple OSS Distributions #ifdef T_NAMESPACE 10*e3723e1fSApple OSS Distributions #undef T_NAMESPACE 11*e3723e1fSApple OSS Distributions #endif 12*e3723e1fSApple OSS Distributions 13*e3723e1fSApple OSS Distributions #include <darwintest.h> 14*e3723e1fSApple OSS Distributions #include <darwintest_utils.h> 15*e3723e1fSApple OSS Distributions 16*e3723e1fSApple OSS Distributions T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true), 17*e3723e1fSApple OSS Distributions T_META_NAMESPACE("xnu.ipc"), 18*e3723e1fSApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"), 19*e3723e1fSApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("IPC"), 20*e3723e1fSApple OSS Distributions T_META_TAG_VM_PREFERRED); 21*e3723e1fSApple OSS Distributions 22*e3723e1fSApple OSS Distributions T_DECL(test_task_filter_msg_flag, "Set the filter msg flag on the task and check if the forked child inherits it", 23*e3723e1fSApple OSS Distributions T_META_ASROOT(true), T_META_CHECK_LEAKS(false)) 24*e3723e1fSApple OSS Distributions { 25*e3723e1fSApple OSS Distributions int ret, dev; 26*e3723e1fSApple OSS Distributions size_t sysctl_size; 27*e3723e1fSApple OSS Distributions 28*e3723e1fSApple OSS Distributions T_SETUPBEGIN; 29*e3723e1fSApple OSS Distributions 30*e3723e1fSApple OSS Distributions dev = 0; 31*e3723e1fSApple OSS Distributions sysctl_size = sizeof(dev); 32*e3723e1fSApple OSS Distributions ret = sysctlbyname("kern.development", &dev, &sysctl_size, NULL, 0); 33*e3723e1fSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "sysctl kern.development failed"); 34*e3723e1fSApple OSS Distributions if (dev == 0) { 35*e3723e1fSApple OSS Distributions T_SKIP("Skipping test on release kernel"); 36*e3723e1fSApple OSS Distributions } 37*e3723e1fSApple OSS Distributions 38*e3723e1fSApple OSS Distributions T_SETUPEND; 39*e3723e1fSApple OSS Distributions 40*e3723e1fSApple OSS Distributions int cur_filter_flag = 0; 41*e3723e1fSApple OSS Distributions int new_filter_flag = 1; 42*e3723e1fSApple OSS Distributions ret = sysctlbyname("kern.task_set_filter_msg_flag", NULL, 0, &new_filter_flag, sizeof(new_filter_flag)); 43*e3723e1fSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "sysctlbyname"); 44*e3723e1fSApple OSS Distributions ret = sysctlbyname("kern.task_set_filter_msg_flag", &cur_filter_flag, &sysctl_size, NULL, 0); 45*e3723e1fSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "sysctlbyname"); 46*e3723e1fSApple OSS Distributions T_ASSERT_EQ(cur_filter_flag, 1, "Task should have filtering on"); 47*e3723e1fSApple OSS Distributions 48*e3723e1fSApple OSS Distributions pid_t pid = fork(); 49*e3723e1fSApple OSS Distributions if (pid == 0) { 50*e3723e1fSApple OSS Distributions cur_filter_flag = 0; 51*e3723e1fSApple OSS Distributions ret = sysctlbyname("kern.task_set_filter_msg_flag", &cur_filter_flag, &sysctl_size, NULL, 0); 52*e3723e1fSApple OSS Distributions if (ret == 0) { 53*e3723e1fSApple OSS Distributions if (cur_filter_flag == 1) { 54*e3723e1fSApple OSS Distributions exit(0); 55*e3723e1fSApple OSS Distributions } 56*e3723e1fSApple OSS Distributions } 57*e3723e1fSApple OSS Distributions exit(1); 58*e3723e1fSApple OSS Distributions } 59*e3723e1fSApple OSS Distributions 60*e3723e1fSApple OSS Distributions int status; 61*e3723e1fSApple OSS Distributions ret = waitpid(pid, &status, 0); 62*e3723e1fSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "waitpid"); 63*e3723e1fSApple OSS Distributions 64*e3723e1fSApple OSS Distributions if (WIFEXITED(status)) { 65*e3723e1fSApple OSS Distributions const int exit_code = WEXITSTATUS(status); 66*e3723e1fSApple OSS Distributions T_ASSERT_EQ(exit_code, 0, "Child inherited the filter msg flag"); 67*e3723e1fSApple OSS Distributions } 68*e3723e1fSApple OSS Distributions 69*e3723e1fSApple OSS Distributions /* Turn off task msg filtering */ 70*e3723e1fSApple OSS Distributions cur_filter_flag = 1; 71*e3723e1fSApple OSS Distributions new_filter_flag = 0; 72*e3723e1fSApple OSS Distributions ret = sysctlbyname("kern.task_set_filter_msg_flag", &cur_filter_flag, &sysctl_size, &new_filter_flag, sizeof(new_filter_flag)); 73*e3723e1fSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(ret, "sysctlbyname"); 74*e3723e1fSApple OSS Distributions T_ASSERT_EQ(cur_filter_flag, 1, "Task should have filtering on"); 75*e3723e1fSApple OSS Distributions 76*e3723e1fSApple OSS Distributions T_END; 77*e3723e1fSApple OSS Distributions } 78