darling-xnu/tests/task_info_28439149.c
2023-05-16 21:41:14 -07:00

85 lines
2.3 KiB
C

#include <darwintest.h>
#include <mach/host_priv.h>
#include <mach/mach.h>
#include <mach/mach_types.h>
#include <mach/processor_set.h>
#include <mach/task.h>
#include <sys/sysctl.h>
#include <unistd.h>
#include <mach-o/dyld.h>
#include <mach-o/dyld_images.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true));
static void
do_child(int *pipefd)
{
int exit = 0;
close(pipefd[1]);
read(pipefd[0], &exit, sizeof(int));
T_QUIET; T_EXPECT_EQ_INT(exit, 1, "exit");
close(pipefd[0]);
}
T_DECL(task_info_28439149, "ensure that task_info has the correct permission",
T_META_CHECK_LEAKS(false), T_META_ASROOT(true))
{
int pipefd[2];
T_QUIET; T_ASSERT_POSIX_SUCCESS(pipe(pipefd), "pipe");
int pid = fork();
T_QUIET; T_ASSERT_POSIX_SUCCESS(pid, "fork");
if (pid == 0) {
do_child(pipefd);
return;
}
close(pipefd[0]);
int exit;
mach_msg_type_number_t count;
struct task_basic_info_64 ti;
task_dyld_info_data_t di;
task_t self = mach_task_self();
task_t other_name;
task_t other;
int ret;
T_EXPECT_MACH_SUCCESS(task_for_pid(self, pid, &other), NULL);
T_EXPECT_MACH_SUCCESS(task_name_for_pid(self, pid, &other_name), NULL);
count = TASK_BASIC_INFO_64_COUNT;
T_EXPECT_MACH_SUCCESS(task_info(self, TASK_BASIC_INFO_64, (task_info_t)&ti,
&count), "task_info(self, TASK_BASIC_INFO_64 ...)");
count = TASK_BASIC_INFO_64_COUNT;
T_EXPECT_MACH_SUCCESS(task_info(other, TASK_BASIC_INFO_64, (task_info_t)&ti,
&count), "task_info(other_name, TASK_BASIC_INFO_64 ...)");
count = TASK_BASIC_INFO_64_COUNT;
T_EXPECT_MACH_SUCCESS(task_info(other_name, TASK_BASIC_INFO_64, (task_info_t)&ti,
&count), "task_info(other_name, TASK_BASIC_INFO_64 ...)");
count = TASK_DYLD_INFO_COUNT;
T_EXPECT_MACH_SUCCESS(task_info(self, TASK_DYLD_INFO, (task_info_t)&di,
&count), "task_info(self, TASK_DYLD_INFO ...)");
count = TASK_DYLD_INFO_COUNT;
T_EXPECT_MACH_SUCCESS(task_info(other, TASK_DYLD_INFO, (task_info_t)&di,
&count), "task_info(other_name, TASK_DYLD_INFO ...)");
count = TASK_DYLD_INFO_COUNT;
ret = task_info(other_name, TASK_DYLD_INFO, (task_info_t)&di, &count);
T_EXPECT_EQ_INT(ret, KERN_INVALID_ARGUMENT, "task info TASK_DYLD_INFO should fail with mach_port_name");
exit = 1;
write(pipefd[1], &exit, sizeof(int));
close(pipefd[1]);
wait(NULL);
}