xref: /xnu-12377.41.6/tests/ipc/corpse_port_register_test.c (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
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