xref: /xnu-10002.61.3/tests/mach_service_port.c (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
1*0f4c859eSApple OSS Distributions #include <darwintest.h>
2*0f4c859eSApple OSS Distributions #include <servers/bootstrap.h>
3*0f4c859eSApple OSS Distributions #include <mach/mach.h>
4*0f4c859eSApple OSS Distributions #include <mach/message.h>
5*0f4c859eSApple OSS Distributions #include <stdlib.h>
6*0f4c859eSApple OSS Distributions #include <sys/sysctl.h>
7*0f4c859eSApple OSS Distributions #include <unistd.h>
8*0f4c859eSApple OSS Distributions #include <mach/port.h>
9*0f4c859eSApple OSS Distributions #include <mach/mach_port.h>
10*0f4c859eSApple OSS Distributions #include <stdint.h>
11*0f4c859eSApple OSS Distributions #include <stdio.h>
12*0f4c859eSApple OSS Distributions #include <unistd.h>
13*0f4c859eSApple OSS Distributions #include <pthread.h>
14*0f4c859eSApple OSS Distributions #include <err.h>
15*0f4c859eSApple OSS Distributions #include <sysexits.h>
16*0f4c859eSApple OSS Distributions 
17*0f4c859eSApple OSS Distributions #include "notifyServer.h"
18*0f4c859eSApple OSS Distributions 
19*0f4c859eSApple OSS Distributions T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true),
20*0f4c859eSApple OSS Distributions     T_META_NAMESPACE("xnu.ipc"),
21*0f4c859eSApple OSS Distributions     T_META_RADAR_COMPONENT_NAME("xnu"),
22*0f4c859eSApple OSS Distributions     T_META_RADAR_COMPONENT_VERSION("IPC"));
23*0f4c859eSApple OSS Distributions 
24*0f4c859eSApple OSS Distributions static mach_port_t service_port = MACH_PORT_NULL;
25*0f4c859eSApple OSS Distributions 
26*0f4c859eSApple OSS Distributions #define SP_CONTEXT (0x1803)
27*0f4c859eSApple OSS Distributions #define NEW_SP_CONTEXT (0x0318)
28*0f4c859eSApple OSS Distributions #define SERVICE_NAME "com.apple.testservice"
29*0f4c859eSApple OSS Distributions #define SERVICE_DOMAIN (1)
30*0f4c859eSApple OSS Distributions 
31*0f4c859eSApple OSS Distributions static inline kern_return_t
service_port_set_throttled(int is_throttled)32*0f4c859eSApple OSS Distributions service_port_set_throttled(int is_throttled)
33*0f4c859eSApple OSS Distributions {
34*0f4c859eSApple OSS Distributions 	return mach_port_set_attributes(mach_task_self(), service_port, MACH_PORT_SERVICE_THROTTLED, (mach_port_info_t)(&is_throttled),
35*0f4c859eSApple OSS Distributions 	           MACH_PORT_SERVICE_THROTTLED_COUNT);
36*0f4c859eSApple OSS Distributions }
37*0f4c859eSApple OSS Distributions 
38*0f4c859eSApple OSS Distributions static inline kern_return_t
service_port_get_throttled(int * is_throttled)39*0f4c859eSApple OSS Distributions service_port_get_throttled(int *is_throttled)
40*0f4c859eSApple OSS Distributions {
41*0f4c859eSApple OSS Distributions 	natural_t count = 0;
42*0f4c859eSApple OSS Distributions 	kern_return_t kr;
43*0f4c859eSApple OSS Distributions 
44*0f4c859eSApple OSS Distributions 	kr = mach_port_get_attributes(mach_task_self(), service_port, MACH_PORT_SERVICE_THROTTLED, (mach_port_info_t)(is_throttled), &count);
45*0f4c859eSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ(count, MACH_PORT_SERVICE_THROTTLED_COUNT, NULL);
46*0f4c859eSApple OSS Distributions 
47*0f4c859eSApple OSS Distributions 	return kr;
48*0f4c859eSApple OSS Distributions }
49*0f4c859eSApple OSS Distributions 
50*0f4c859eSApple OSS Distributions T_DECL(mach_service_port, "Create a port with a service port label", T_META_CHECK_LEAKS(false)) {
51*0f4c859eSApple OSS Distributions 	mach_port_t connection_port;
52*0f4c859eSApple OSS Distributions 	mach_port_t notify_port;
53*0f4c859eSApple OSS Distributions 	mach_port_t previous;
54*0f4c859eSApple OSS Distributions 	uint64_t fpid = 0;
55*0f4c859eSApple OSS Distributions 	boolean_t is_throttled;
56*0f4c859eSApple OSS Distributions 
57*0f4c859eSApple OSS Distributions 	struct mach_service_port_info sp_info = {};
58*0f4c859eSApple OSS Distributions 
59*0f4c859eSApple OSS Distributions 	strcpy(sp_info.mspi_string_name, SERVICE_NAME);
60*0f4c859eSApple OSS Distributions 	sp_info.mspi_domain_type = (uint8_t)SERVICE_DOMAIN;
61*0f4c859eSApple OSS Distributions 	kern_return_t kr;
62*0f4c859eSApple OSS Distributions 
63*0f4c859eSApple OSS Distributions 	mach_port_options_t opts = {
64*0f4c859eSApple OSS Distributions 		.flags = MPO_SERVICE_PORT | MPO_INSERT_SEND_RIGHT | MPO_CONTEXT_AS_GUARD | MPO_STRICT,
65*0f4c859eSApple OSS Distributions 		.service_port_info = &sp_info,
66*0f4c859eSApple OSS Distributions 	};
67*0f4c859eSApple OSS Distributions 
68*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts, SP_CONTEXT, &service_port);
69*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_construct %u", service_port);
70*0f4c859eSApple OSS Distributions 
71*0f4c859eSApple OSS Distributions 	mach_port_options_t opts2 = {
72*0f4c859eSApple OSS Distributions 		.flags = MPO_CONNECTION_PORT,
73*0f4c859eSApple OSS Distributions 		.service_port_name = service_port,
74*0f4c859eSApple OSS Distributions 	};
75*0f4c859eSApple OSS Distributions 
76*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts2, 0x0, &connection_port);
77*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_construct %u", connection_port);
78*0f4c859eSApple OSS Distributions 
79*0f4c859eSApple OSS Distributions 	kr = mach_port_is_connection_for_service(mach_task_self(), connection_port, service_port, &fpid);
80*0f4c859eSApple OSS Distributions 	if (kr != KERN_SUCCESS || kr != KERN_NOT_SUPPORTED) {
81*0f4c859eSApple OSS Distributions 		T_LOG("mach_port_is_connection_for_service kr = %d, fpid = %llu", kr, fpid);
82*0f4c859eSApple OSS Distributions 	}
83*0f4c859eSApple OSS Distributions 
84*0f4c859eSApple OSS Distributions 	// notification port for the service port to come back on
85*0f4c859eSApple OSS Distributions 	kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &notify_port);
86*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_allocate notify_port");
87*0f4c859eSApple OSS Distributions 
88*0f4c859eSApple OSS Distributions 	kr = mach_port_insert_right(mach_task_self(), notify_port, notify_port, MACH_MSG_TYPE_MAKE_SEND);
89*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_insert_right notify_port");
90*0f4c859eSApple OSS Distributions 
91*0f4c859eSApple OSS Distributions 	T_LOG("service port: 0x%x, notify port: 0x%x\n", service_port, notify_port);
92*0f4c859eSApple OSS Distributions 
93*0f4c859eSApple OSS Distributions 	kr = mach_port_request_notification(mach_task_self(), service_port, MACH_NOTIFY_PORT_DESTROYED, 0, notify_port,
94*0f4c859eSApple OSS Distributions 	    MACH_MSG_TYPE_MAKE_SEND_ONCE, &previous);
95*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_request_notification service_port");
96*0f4c859eSApple OSS Distributions 	T_ASSERT_EQ(previous, MACH_PORT_NULL, "previous null");
97*0f4c859eSApple OSS Distributions 
98*0f4c859eSApple OSS Distributions 	/* Test port throttling flag */
99*0f4c859eSApple OSS Distributions 	kr = service_port_get_throttled(&is_throttled);
100*0f4c859eSApple OSS Distributions 	T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "get throttled flag value on port");
101*0f4c859eSApple OSS Distributions 	T_ASSERT_EQ(is_throttled, 0, "newly created service port is not throttled");
102*0f4c859eSApple OSS Distributions 
103*0f4c859eSApple OSS Distributions 	kr = service_port_set_throttled(1);
104*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "set throttled flag on port");
105*0f4c859eSApple OSS Distributions 
106*0f4c859eSApple OSS Distributions 	kr = service_port_get_throttled(&is_throttled);
107*0f4c859eSApple OSS Distributions 	T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "get throttled flag value on port");
108*0f4c859eSApple OSS Distributions 	T_ASSERT_EQ(is_throttled, 1, "port is throttled");
109*0f4c859eSApple OSS Distributions 
110*0f4c859eSApple OSS Distributions 	kr = service_port_set_throttled(0);
111*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "unset throttled flag on port");
112*0f4c859eSApple OSS Distributions 
113*0f4c859eSApple OSS Distributions 	kr = service_port_get_throttled(&is_throttled);
114*0f4c859eSApple OSS Distributions 	T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "get throttled flag value on port");
115*0f4c859eSApple OSS Distributions 	T_ASSERT_EQ(is_throttled, false, "port is no longer throttled");
116*0f4c859eSApple OSS Distributions 
117*0f4c859eSApple OSS Distributions 	/* Attempt to destroy port */
118*0f4c859eSApple OSS Distributions 	kr = mach_port_destruct(mach_task_self(), service_port, 0, SP_CONTEXT);
119*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_destruct service_port");
120*0f4c859eSApple OSS Distributions 
121*0f4c859eSApple OSS Distributions 	/*
122*0f4c859eSApple OSS Distributions 	 * Recover the service port because the port must have been destroyed and sent the notification by now
123*0f4c859eSApple OSS Distributions 	 */
124*0f4c859eSApple OSS Distributions 	kr = mach_msg_server_once(notify_server, MACH_MSG_SIZE_RELIABLE, notify_port, MACH_RCV_TIMEOUT);
125*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_msg_server_once notify_port");
126*0f4c859eSApple OSS Distributions 
127*0f4c859eSApple OSS Distributions 	T_LOG("done");
128*0f4c859eSApple OSS Distributions }
129*0f4c859eSApple OSS Distributions 
130*0f4c859eSApple OSS Distributions kern_return_t
do_mach_notify_port_destroyed(mach_port_t notify,mach_port_t name)131*0f4c859eSApple OSS Distributions do_mach_notify_port_destroyed(mach_port_t notify, mach_port_t name)
132*0f4c859eSApple OSS Distributions {
133*0f4c859eSApple OSS Distributions 	kern_return_t kr;
134*0f4c859eSApple OSS Distributions 
135*0f4c859eSApple OSS Distributions 	T_LOG("Received a service port destroyed notification notify = 0x%x name = 0x%x", notify, name);
136*0f4c859eSApple OSS Distributions 	if (name == MACH_PORT_NULL) {
137*0f4c859eSApple OSS Distributions 		T_FAIL("do_mach_notify_port_destroyed: MACH_PORT_NULL?");
138*0f4c859eSApple OSS Distributions 	}
139*0f4c859eSApple OSS Distributions 
140*0f4c859eSApple OSS Distributions 	if (name != service_port) {
141*0f4c859eSApple OSS Distributions 		T_FAIL("do_mach_notify_port_destroyed: name 0x%x != service_port: 0x%x", name, service_port);
142*0f4c859eSApple OSS Distributions 	}
143*0f4c859eSApple OSS Distributions 
144*0f4c859eSApple OSS Distributions 	struct mach_service_port_info sp_info = {};
145*0f4c859eSApple OSS Distributions 	kr = mach_port_get_service_port_info(mach_task_self(), service_port, &sp_info);
146*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_get_service_port_info");
147*0f4c859eSApple OSS Distributions 
148*0f4c859eSApple OSS Distributions 	if (strcmp(sp_info.mspi_string_name, SERVICE_NAME)) {
149*0f4c859eSApple OSS Distributions 		T_FAIL("Service port name = %s is incorrect", sp_info.mspi_string_name);
150*0f4c859eSApple OSS Distributions 	}
151*0f4c859eSApple OSS Distributions 	T_ASSERT_EQ(sp_info.mspi_domain_type, SERVICE_DOMAIN, "Service domain = %u", sp_info.mspi_domain_type);
152*0f4c859eSApple OSS Distributions 
153*0f4c859eSApple OSS Distributions 	mach_port_guard_info_t mpgi = {SP_CONTEXT};
154*0f4c859eSApple OSS Distributions 	kr = mach_port_assert_attributes(mach_task_self(), service_port, MACH_PORT_GUARD_INFO, (mach_port_info_t)&mpgi, MACH_PORT_GUARD_INFO_COUNT);
155*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_assert_attributes");
156*0f4c859eSApple OSS Distributions 
157*0f4c859eSApple OSS Distributions 	return KERN_SUCCESS;
158*0f4c859eSApple OSS Distributions }
159*0f4c859eSApple OSS Distributions 
160*0f4c859eSApple OSS Distributions kern_return_t
do_mach_notify_port_deleted(__unused mach_port_t notify,__unused mach_port_name_t name)161*0f4c859eSApple OSS Distributions do_mach_notify_port_deleted(__unused mach_port_t notify, __unused mach_port_name_t name)
162*0f4c859eSApple OSS Distributions {
163*0f4c859eSApple OSS Distributions 	return KERN_SUCCESS;
164*0f4c859eSApple OSS Distributions }
165*0f4c859eSApple OSS Distributions 
166*0f4c859eSApple OSS Distributions kern_return_t
do_mach_notify_no_senders(__unused mach_port_t notify,__unused mach_port_mscount_t mscount)167*0f4c859eSApple OSS Distributions do_mach_notify_no_senders(__unused mach_port_t notify, __unused mach_port_mscount_t mscount)
168*0f4c859eSApple OSS Distributions {
169*0f4c859eSApple OSS Distributions 	return KERN_SUCCESS;
170*0f4c859eSApple OSS Distributions }
171*0f4c859eSApple OSS Distributions 
172*0f4c859eSApple OSS Distributions kern_return_t
do_mach_notify_send_once(__unused mach_port_t notify)173*0f4c859eSApple OSS Distributions do_mach_notify_send_once(__unused mach_port_t notify)
174*0f4c859eSApple OSS Distributions {
175*0f4c859eSApple OSS Distributions 	return KERN_SUCCESS;
176*0f4c859eSApple OSS Distributions }
177*0f4c859eSApple OSS Distributions 
178*0f4c859eSApple OSS Distributions kern_return_t
do_mach_notify_dead_name(__unused mach_port_t notify,__unused mach_port_name_t name)179*0f4c859eSApple OSS Distributions do_mach_notify_dead_name(__unused mach_port_t notify, __unused mach_port_name_t name)
180*0f4c859eSApple OSS Distributions {
181*0f4c859eSApple OSS Distributions 	return KERN_SUCCESS;
182*0f4c859eSApple OSS Distributions }
183*0f4c859eSApple OSS Distributions 
184*0f4c859eSApple OSS Distributions #define SERVICE_NAME_2 "com.apple.testservice2"
185*0f4c859eSApple OSS Distributions #define SERVICE_DOMAIN_2 (2)
186*0f4c859eSApple OSS Distributions 
187*0f4c859eSApple OSS Distributions T_DECL(mach_fake_service_port, "Create a connection port with a fake service port", T_META_CHECK_LEAKS(false))
188*0f4c859eSApple OSS Distributions {
189*0f4c859eSApple OSS Distributions 	mach_port_t connection_port;
190*0f4c859eSApple OSS Distributions 	mach_port_t fake_service_port;
191*0f4c859eSApple OSS Distributions 	mach_port_t service_port_2;
192*0f4c859eSApple OSS Distributions 
193*0f4c859eSApple OSS Distributions 	kern_return_t kr;
194*0f4c859eSApple OSS Distributions 
195*0f4c859eSApple OSS Distributions 	struct mach_service_port_info sp_info = {};
196*0f4c859eSApple OSS Distributions 
197*0f4c859eSApple OSS Distributions 	strcpy(sp_info.mspi_string_name, SERVICE_NAME_2);
198*0f4c859eSApple OSS Distributions 	sp_info.mspi_domain_type = (uint8_t)SERVICE_DOMAIN_2;
199*0f4c859eSApple OSS Distributions 
200*0f4c859eSApple OSS Distributions 	mach_port_options_t opts = {
201*0f4c859eSApple OSS Distributions 		.flags = MPO_CONNECTION_PORT | MPO_SERVICE_PORT | MPO_INSERT_SEND_RIGHT | MPO_CONTEXT_AS_GUARD,
202*0f4c859eSApple OSS Distributions 		.service_port_info = &sp_info,
203*0f4c859eSApple OSS Distributions 	};
204*0f4c859eSApple OSS Distributions 
205*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts, SP_CONTEXT, &service_port_2);
206*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_ERROR(kr, KERN_INVALID_ARGUMENT, "mach_port_construct with extra flags %u", service_port_2);
207*0f4c859eSApple OSS Distributions 
208*0f4c859eSApple OSS Distributions 	mach_port_options_t opts2 = {
209*0f4c859eSApple OSS Distributions 		.flags = MPO_SERVICE_PORT | MPO_INSERT_SEND_RIGHT | MPO_CONTEXT_AS_GUARD,
210*0f4c859eSApple OSS Distributions 		.service_port_info = NULL,
211*0f4c859eSApple OSS Distributions 	};
212*0f4c859eSApple OSS Distributions 
213*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts2, SP_CONTEXT, &service_port_2);
214*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_ERROR(kr, KERN_INVALID_ARGUMENT, "mach_port_construct with missing service port info %u", service_port_2);
215*0f4c859eSApple OSS Distributions 
216*0f4c859eSApple OSS Distributions 	mach_port_options_t opts3 = {
217*0f4c859eSApple OSS Distributions 		.flags = MPO_INSERT_SEND_RIGHT | MPO_CONTEXT_AS_GUARD,
218*0f4c859eSApple OSS Distributions 	};
219*0f4c859eSApple OSS Distributions 
220*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts3, SP_CONTEXT, &fake_service_port);
221*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_construct with missing flag %u", fake_service_port);
222*0f4c859eSApple OSS Distributions 
223*0f4c859eSApple OSS Distributions 	struct mach_service_port_info sp_info3 = {};
224*0f4c859eSApple OSS Distributions 	kr = mach_port_get_service_port_info(mach_task_self(), fake_service_port, &sp_info3);
225*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_ERROR(kr, KERN_INVALID_CAPABILITY, "mach_port_get_service_port_info");
226*0f4c859eSApple OSS Distributions 
227*0f4c859eSApple OSS Distributions 	mach_port_options_t opts4 = {
228*0f4c859eSApple OSS Distributions 		.flags = MPO_CONNECTION_PORT,
229*0f4c859eSApple OSS Distributions 		.service_port_name = fake_service_port,
230*0f4c859eSApple OSS Distributions 	};
231*0f4c859eSApple OSS Distributions 
232*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts4, 0x0, &connection_port);
233*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_ERROR(kr, KERN_INVALID_CAPABILITY, "mach_port_construct connection port %u", connection_port);
234*0f4c859eSApple OSS Distributions 
235*0f4c859eSApple OSS Distributions 	T_LOG("done");
236*0f4c859eSApple OSS Distributions }
237*0f4c859eSApple OSS Distributions 
238*0f4c859eSApple OSS Distributions T_DECL(mach_dead_service_port, "Create a connection port with a dead service port", T_META_CHECK_LEAKS(false))
239*0f4c859eSApple OSS Distributions {
240*0f4c859eSApple OSS Distributions 	mach_port_t connection_port;
241*0f4c859eSApple OSS Distributions 	mach_port_t service_port_2;
242*0f4c859eSApple OSS Distributions 
243*0f4c859eSApple OSS Distributions 	kern_return_t kr;
244*0f4c859eSApple OSS Distributions 
245*0f4c859eSApple OSS Distributions 	struct mach_service_port_info sp_info = {};
246*0f4c859eSApple OSS Distributions 
247*0f4c859eSApple OSS Distributions 	strcpy(sp_info.mspi_string_name, SERVICE_NAME_2);
248*0f4c859eSApple OSS Distributions 	sp_info.mspi_domain_type = (uint8_t)SERVICE_DOMAIN_2;
249*0f4c859eSApple OSS Distributions 
250*0f4c859eSApple OSS Distributions 	mach_port_options_t opts = {
251*0f4c859eSApple OSS Distributions 		.flags = MPO_SERVICE_PORT | MPO_INSERT_SEND_RIGHT,
252*0f4c859eSApple OSS Distributions 		.service_port_info = &sp_info,
253*0f4c859eSApple OSS Distributions 	};
254*0f4c859eSApple OSS Distributions 
255*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts, 0, &service_port_2);
256*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_construct %u", service_port_2);
257*0f4c859eSApple OSS Distributions 
258*0f4c859eSApple OSS Distributions 	kr = mach_port_mod_refs(mach_task_self(), service_port_2, MACH_PORT_RIGHT_RECEIVE, -1);
259*0f4c859eSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(kr, "mach_port_mod_refs");
260*0f4c859eSApple OSS Distributions 
261*0f4c859eSApple OSS Distributions 	mach_port_options_t opts3 = {
262*0f4c859eSApple OSS Distributions 		.flags = MPO_CONNECTION_PORT,
263*0f4c859eSApple OSS Distributions 		.service_port_name = service_port_2,
264*0f4c859eSApple OSS Distributions 	};
265*0f4c859eSApple OSS Distributions 
266*0f4c859eSApple OSS Distributions 	kr = mach_port_construct(mach_task_self(), &opts3, 0x0, &connection_port);
267*0f4c859eSApple OSS Distributions 	T_LOG("mach_port_construct connection port kr = %d", kr);
268*0f4c859eSApple OSS Distributions 
269*0f4c859eSApple OSS Distributions 	if (kr == KERN_INVALID_RIGHT || kr == KERN_INVALID_NAME) {
270*0f4c859eSApple OSS Distributions 		T_PASS("Invalid service port");
271*0f4c859eSApple OSS Distributions 	} else {
272*0f4c859eSApple OSS Distributions 		T_FAIL("mach_port_construct incorrect return value");
273*0f4c859eSApple OSS Distributions 	}
274*0f4c859eSApple OSS Distributions 
275*0f4c859eSApple OSS Distributions 	T_LOG("done");
276*0f4c859eSApple OSS Distributions }
277