1 #include <darwintest.h>
2 #include <mach/mach.h>
3 #include <mach/mach_vm.h>
4
5 /*
6 * This test verifies that we can:
7 * 1. Generate a corpse port using task_generate_corpse
8 * 2. Register the corpse port via the mach_ports_register API, ensuring it returns KERN_SUCCESS
9 */
10 T_GLOBAL_META(
11 T_META_NAMESPACE("xnu.ipc"),
12 T_META_RADAR_COMPONENT_NAME("xnu"),
13 T_META_RADAR_COMPONENT_VERSION("IPC"),
14 T_META_RUN_CONCURRENTLY(true));
15
16 static void
test_corpse_port_register(void)17 test_corpse_port_register(void)
18 {
19 kern_return_t kr;
20 mach_port_t corpse_port = MACH_PORT_NULL;
21
22 T_LOG("Generating corpse port using task_generate_corpse");
23
24 /* Generate a corpse port for the current task */
25 kr = task_generate_corpse(mach_task_self(), &corpse_port);
26 if (kr == KERN_RESOURCE_SHORTAGE) {
27 T_SKIP("Corpse generation failed due to resource shortage - this is expected under load");
28 }
29 T_ASSERT_MACH_SUCCESS(kr, "task_generate_corpse should succeed");
30 T_ASSERT_NE(corpse_port, MACH_PORT_NULL, "Should have received a valid corpse port");
31
32 T_LOG("Generated corpse port: 0x%x", corpse_port);
33
34 /* Now test registering the corpse port via mach_ports_register */
35 mach_port_t ports_to_register[1] = {corpse_port};
36 kr = mach_ports_register(mach_task_self(), ports_to_register, 1);
37 T_ASSERT_MACH_SUCCESS(kr, "mach_ports_register should succeed with corpse port");
38
39 T_LOG("Successfully registered corpse port via mach_ports_register");
40
41 /* Clean up - unregister the ports */
42 kr = mach_ports_register(mach_task_self(), NULL, 0);
43 T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "mach_ports_register cleanup");
44
45 /* Clean up the corpse port */
46 if (corpse_port != MACH_PORT_NULL) {
47 kr = mach_port_deallocate(mach_task_self(), corpse_port);
48 T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "mach_port_deallocate corpse_port");
49 }
50 }
51
52 T_DECL(corpse_port_register_test, "Test registering corpse port via mach_ports_register",
53 T_META_IGNORECRASHES(".*sh.*"),
54 T_META_CHECK_LEAKS(false))
55 {
56 test_corpse_port_register();
57 }
58