1*0f4c859eSApple OSS Distributions #include <darwintest.h>
2*0f4c859eSApple OSS Distributions
3*0f4c859eSApple OSS Distributions #include <mach/host_priv.h>
4*0f4c859eSApple OSS Distributions #include <mach/mach.h>
5*0f4c859eSApple OSS Distributions #include <mach/mach_types.h>
6*0f4c859eSApple OSS Distributions #include <mach/mach_vm.h>
7*0f4c859eSApple OSS Distributions #include <mach_debug/ipc_info.h>
8*0f4c859eSApple OSS Distributions #include <mach/processor_set.h>
9*0f4c859eSApple OSS Distributions #include <mach/task.h>
10*0f4c859eSApple OSS Distributions #include <signal.h>
11*0f4c859eSApple OSS Distributions #include <sys/wait.h>
12*0f4c859eSApple OSS Distributions #include <sys/proc.h>
13*0f4c859eSApple OSS Distributions #include <sys/sysctl.h>
14*0f4c859eSApple OSS Distributions #include <unistd.h>
15*0f4c859eSApple OSS Distributions #include <TargetConditionals.h>
16*0f4c859eSApple OSS Distributions
17*0f4c859eSApple OSS Distributions #define IKOT_THREAD_CONTROL 1
18*0f4c859eSApple OSS Distributions #define IKOT_THREAD_READ 47
19*0f4c859eSApple OSS Distributions #define IKOT_THREAD_INSPECT 46
20*0f4c859eSApple OSS Distributions
21*0f4c859eSApple OSS Distributions #define IKOT_TASK_CONTROL 2
22*0f4c859eSApple OSS Distributions #define IKOT_TASK_READ 45
23*0f4c859eSApple OSS Distributions #define IKOT_TASK_INSPECT 44
24*0f4c859eSApple OSS Distributions #define IKOT_TASK_NAME 20
25*0f4c859eSApple OSS Distributions
26*0f4c859eSApple OSS Distributions
27*0f4c859eSApple OSS Distributions /*
28*0f4c859eSApple OSS Distributions * This test verifies various security properties for task and thread
29*0f4c859eSApple OSS Distributions * read/inspect interfaces. Specifically, it checks and makes sure:
30*0f4c859eSApple OSS Distributions *
31*0f4c859eSApple OSS Distributions * 1. Task/thread can't get higher priv'ed ports from lower ones through
32*0f4c859eSApple OSS Distributions * {task, thread}_get_special_port()
33*0f4c859eSApple OSS Distributions * 2. Correct level of thread ports are returned from task_threads() with
34*0f4c859eSApple OSS Distributions * a given task port flavor
35*0f4c859eSApple OSS Distributions * 3. Correct level of task ports are returned from processor_set_tasks()
36*0f4c859eSApple OSS Distributions * 4. MIG intrans conversion and enforcement for task/thread port does not break.
37*0f4c859eSApple OSS Distributions * 5. task_{, read, inspect, name}_for_pid() works for self and other process
38*0f4c859eSApple OSS Distributions * 6. The new mach_vm_remap_new interface behaves correctly
39*0f4c859eSApple OSS Distributions */
40*0f4c859eSApple OSS Distributions
41*0f4c859eSApple OSS Distributions T_GLOBAL_META(
42*0f4c859eSApple OSS Distributions T_META_NAMESPACE("xnu.ipc"),
43*0f4c859eSApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
44*0f4c859eSApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("IPC"),
45*0f4c859eSApple OSS Distributions T_META_RUN_CONCURRENTLY(TRUE));
46*0f4c859eSApple OSS Distributions
47*0f4c859eSApple OSS Distributions static void
RESULT_CHECK(kern_return_t kr,unsigned int flavor,unsigned int required,char * f_name)48*0f4c859eSApple OSS Distributions RESULT_CHECK(
49*0f4c859eSApple OSS Distributions kern_return_t kr,
50*0f4c859eSApple OSS Distributions unsigned int flavor, /* task_flavor_t or thread_flavor_t */
51*0f4c859eSApple OSS Distributions unsigned int required, /* task_flavor_t or thread_flavor_t */
52*0f4c859eSApple OSS Distributions char *f_name)
53*0f4c859eSApple OSS Distributions {
54*0f4c859eSApple OSS Distributions if (flavor <= required) {
55*0f4c859eSApple OSS Distributions T_EXPECT_EQ(kr, KERN_SUCCESS, "%s should succeed with task/thread flavor %d, kr: 0x%x", f_name, flavor, kr);
56*0f4c859eSApple OSS Distributions } else {
57*0f4c859eSApple OSS Distributions T_EXPECT_NE(kr, KERN_SUCCESS, "%s should fail with task/thread flavor %d, kr: 0x%x", f_name, flavor, kr);
58*0f4c859eSApple OSS Distributions }
59*0f4c859eSApple OSS Distributions }
60*0f4c859eSApple OSS Distributions
61*0f4c859eSApple OSS Distributions static void
test_task_get_special_port(task_t tport,task_flavor_t flavor)62*0f4c859eSApple OSS Distributions test_task_get_special_port(
63*0f4c859eSApple OSS Distributions task_t tport,
64*0f4c859eSApple OSS Distributions task_flavor_t flavor)
65*0f4c859eSApple OSS Distributions {
66*0f4c859eSApple OSS Distributions kern_return_t kr;
67*0f4c859eSApple OSS Distributions mach_port_t special_port = MACH_PORT_NULL;
68*0f4c859eSApple OSS Distributions mach_port_t tfp_port = MACH_PORT_NULL;
69*0f4c859eSApple OSS Distributions
70*0f4c859eSApple OSS Distributions T_LOG("Testing task_get_special_port() with task flavor %d", flavor);
71*0f4c859eSApple OSS Distributions /* gettable with at least control port */
72*0f4c859eSApple OSS Distributions kr = task_get_special_port(tport, TASK_KERNEL_PORT, &special_port);
73*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_CONTROL, "task_get_special_port(TASK_KERNEL_PORT)");
74*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
75*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
76*0f4c859eSApple OSS Distributions
77*0f4c859eSApple OSS Distributions kr = task_get_special_port(tport, TASK_BOOTSTRAP_PORT, &special_port);
78*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_CONTROL, "task_get_special_port(TASK_BOOTSTRAP_PORT)");
79*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
80*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
81*0f4c859eSApple OSS Distributions
82*0f4c859eSApple OSS Distributions kr = task_get_special_port(tport, TASK_HOST_PORT, &special_port);
83*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_CONTROL, "task_get_special_port(TASK_HOST_PORT)");
84*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
85*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
86*0f4c859eSApple OSS Distributions
87*0f4c859eSApple OSS Distributions /* gettable with at least read port */
88*0f4c859eSApple OSS Distributions kr = task_get_special_port(tport, TASK_READ_PORT, &special_port);
89*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_READ, "task_get_special_port(TASK_READ_PORT)");
90*0f4c859eSApple OSS Distributions if (KERN_SUCCESS == kr) {
91*0f4c859eSApple OSS Distributions kr = task_read_for_pid(mach_task_self(), getpid(), &tfp_port);
92*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_read_for_pid()");
93*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(tfp_port, special_port, "task_read_for_pid() should match TASK_READ_PORT");
94*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tfp_port);
95*0f4c859eSApple OSS Distributions }
96*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
97*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
98*0f4c859eSApple OSS Distributions
99*0f4c859eSApple OSS Distributions /* gettable with at least inspect port */
100*0f4c859eSApple OSS Distributions kr = task_get_special_port(tport, TASK_INSPECT_PORT, &special_port);
101*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_INSPECT, "task_get_special_port(TASK_INSPECT_PORT)");
102*0f4c859eSApple OSS Distributions if (KERN_SUCCESS == kr) {
103*0f4c859eSApple OSS Distributions kr = task_inspect_for_pid(mach_task_self(), getpid(), &tfp_port);
104*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_inspect_for_pid()");
105*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(tfp_port, special_port, "task_inspect_for_pid() should match TASK_INSPECT_PORT");
106*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tfp_port);
107*0f4c859eSApple OSS Distributions }
108*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
109*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
110*0f4c859eSApple OSS Distributions
111*0f4c859eSApple OSS Distributions /* gettable with at least name port */
112*0f4c859eSApple OSS Distributions kr = task_get_special_port(tport, TASK_NAME_PORT, &special_port);
113*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_INSPECT, "task_get_special_port(TASK_NAME_PORT)");
114*0f4c859eSApple OSS Distributions if (KERN_SUCCESS == kr) {
115*0f4c859eSApple OSS Distributions kr = task_name_for_pid(mach_task_self(), getpid(), &tfp_port);
116*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_name_for_pid()");
117*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(tfp_port, special_port, "task_name_for_pid() should match TASK_NAME_PORT");
118*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tfp_port);
119*0f4c859eSApple OSS Distributions }
120*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
121*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
122*0f4c859eSApple OSS Distributions }
123*0f4c859eSApple OSS Distributions
124*0f4c859eSApple OSS Distributions static void
test_thread_get_special_port(thread_t tport,thread_flavor_t flavor)125*0f4c859eSApple OSS Distributions test_thread_get_special_port(
126*0f4c859eSApple OSS Distributions thread_t tport,
127*0f4c859eSApple OSS Distributions thread_flavor_t flavor)
128*0f4c859eSApple OSS Distributions {
129*0f4c859eSApple OSS Distributions kern_return_t kr;
130*0f4c859eSApple OSS Distributions mach_port_t special_port = MACH_PORT_NULL;
131*0f4c859eSApple OSS Distributions
132*0f4c859eSApple OSS Distributions T_LOG("Testing thread_get_special_port() with thread flavor %d", flavor);
133*0f4c859eSApple OSS Distributions /* gettable with at least control port */
134*0f4c859eSApple OSS Distributions kr = thread_get_special_port(tport, THREAD_KERNEL_PORT, &special_port);
135*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, THREAD_FLAVOR_CONTROL, "thread_get_special_port(THREAD_KERNEL_PORT)");
136*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
137*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
138*0f4c859eSApple OSS Distributions
139*0f4c859eSApple OSS Distributions /* gettable with at least read port */
140*0f4c859eSApple OSS Distributions kr = thread_get_special_port(tport, THREAD_READ_PORT, &special_port);
141*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, THREAD_FLAVOR_READ, "thread_get_special_port(THREAD_READ_PORT)");
142*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
143*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
144*0f4c859eSApple OSS Distributions
145*0f4c859eSApple OSS Distributions /* gettable with at least inspect port */
146*0f4c859eSApple OSS Distributions kr = thread_get_special_port(tport, THREAD_INSPECT_PORT, &special_port);
147*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, THREAD_FLAVOR_INSPECT, "thread_get_special_port(THREAD_INSPECT_PORT)");
148*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), special_port);
149*0f4c859eSApple OSS Distributions special_port = MACH_PORT_NULL;
150*0f4c859eSApple OSS Distributions }
151*0f4c859eSApple OSS Distributions
152*0f4c859eSApple OSS Distributions static void
test_task_threads(task_t tport,task_flavor_t flavor)153*0f4c859eSApple OSS Distributions test_task_threads(
154*0f4c859eSApple OSS Distributions task_t tport,
155*0f4c859eSApple OSS Distributions task_flavor_t flavor)
156*0f4c859eSApple OSS Distributions {
157*0f4c859eSApple OSS Distributions kern_return_t kr;
158*0f4c859eSApple OSS Distributions thread_array_t threadList;
159*0f4c859eSApple OSS Distributions mach_msg_type_number_t threadCount = 0;
160*0f4c859eSApple OSS Distributions
161*0f4c859eSApple OSS Distributions unsigned int kotype;
162*0f4c859eSApple OSS Distributions unsigned int kaddr;
163*0f4c859eSApple OSS Distributions
164*0f4c859eSApple OSS Distributions T_LOG("Testing task_threads() with task flavor %d", flavor);
165*0f4c859eSApple OSS Distributions
166*0f4c859eSApple OSS Distributions kr = task_threads(tport, &threadList, &threadCount);
167*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_INSPECT, "task_threads");
168*0f4c859eSApple OSS Distributions
169*0f4c859eSApple OSS Distributions if (kr) {
170*0f4c859eSApple OSS Distributions T_LOG("task_threads failed, skipping test_task_threads()");
171*0f4c859eSApple OSS Distributions return;
172*0f4c859eSApple OSS Distributions }
173*0f4c859eSApple OSS Distributions
174*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_GE(threadCount, 1, "threadCount should be at least 1");
175*0f4c859eSApple OSS Distributions
176*0f4c859eSApple OSS Distributions /*
177*0f4c859eSApple OSS Distributions * TASK_FLAVOR_CONTROL -> THREAD_FLAVOR_CONTROL
178*0f4c859eSApple OSS Distributions * TASK_FLAVOR_READ -> THREAD_FLAVOR_READ
179*0f4c859eSApple OSS Distributions * TASK_FLAVOR_INSPECT -> THREAD_FLAVOR_INSPECT
180*0f4c859eSApple OSS Distributions * TASK_FLAOVR_NAME -> KERN_FAILURE
181*0f4c859eSApple OSS Distributions */
182*0f4c859eSApple OSS Distributions for (size_t i = 0; i < threadCount; i++) {
183*0f4c859eSApple OSS Distributions kr = mach_port_kernel_object(mach_task_self(), threadList[i], &kotype, &kaddr);
184*0f4c859eSApple OSS Distributions if (kr == KERN_INVALID_RIGHT || kr == KERN_INVALID_NAME) {
185*0f4c859eSApple OSS Distributions /* thread port is inactive */
186*0f4c859eSApple OSS Distributions T_LOG("thread port name 0x%x is inactive", threadList[i]);
187*0f4c859eSApple OSS Distributions continue;
188*0f4c859eSApple OSS Distributions } else if (kr) {
189*0f4c859eSApple OSS Distributions T_FAIL("mach_port_kernel_object() failed with kr: 0x%x", kr);
190*0f4c859eSApple OSS Distributions }
191*0f4c859eSApple OSS Distributions switch (flavor) {
192*0f4c859eSApple OSS Distributions case TASK_FLAVOR_CONTROL:
193*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_THREAD_CONTROL, "Task control port should yield thread control port");
194*0f4c859eSApple OSS Distributions break;
195*0f4c859eSApple OSS Distributions case TASK_FLAVOR_READ:
196*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_THREAD_READ, "Task read port should yield thread read port");
197*0f4c859eSApple OSS Distributions break;
198*0f4c859eSApple OSS Distributions case TASK_FLAVOR_INSPECT:
199*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_THREAD_INSPECT, "Task inspect port should yield thread inspect port");
200*0f4c859eSApple OSS Distributions break;
201*0f4c859eSApple OSS Distributions default:
202*0f4c859eSApple OSS Distributions T_FAIL("task_threads() returned thread ports with task name port??");
203*0f4c859eSApple OSS Distributions break;
204*0f4c859eSApple OSS Distributions }
205*0f4c859eSApple OSS Distributions }
206*0f4c859eSApple OSS Distributions
207*0f4c859eSApple OSS Distributions for (size_t i = 0; i < threadCount; i++) {
208*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), threadList[i]);
209*0f4c859eSApple OSS Distributions }
210*0f4c859eSApple OSS Distributions vm_deallocate(mach_task_self(), (vm_address_t)threadList,
211*0f4c859eSApple OSS Distributions sizeof(threadList[0]) * threadCount);
212*0f4c859eSApple OSS Distributions }
213*0f4c859eSApple OSS Distributions
214*0f4c859eSApple OSS Distributions static void
test_processor_set_tasks(task_flavor_t flavor)215*0f4c859eSApple OSS Distributions test_processor_set_tasks(
216*0f4c859eSApple OSS Distributions task_flavor_t flavor)
217*0f4c859eSApple OSS Distributions {
218*0f4c859eSApple OSS Distributions kern_return_t kr;
219*0f4c859eSApple OSS Distributions processor_set_name_array_t psets;
220*0f4c859eSApple OSS Distributions processor_set_t pset_priv;
221*0f4c859eSApple OSS Distributions task_array_t taskList;
222*0f4c859eSApple OSS Distributions mach_msg_type_number_t pcnt = 0, tcnt = 0;
223*0f4c859eSApple OSS Distributions mach_port_t host = mach_host_self();
224*0f4c859eSApple OSS Distributions
225*0f4c859eSApple OSS Distributions unsigned int kotype;
226*0f4c859eSApple OSS Distributions unsigned int kaddr;
227*0f4c859eSApple OSS Distributions
228*0f4c859eSApple OSS Distributions T_LOG("Testing processor_set_tasks() with task flavor %d", flavor);
229*0f4c859eSApple OSS Distributions
230*0f4c859eSApple OSS Distributions kr = host_processor_sets(host, &psets, &pcnt);
231*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "host_processor_sets");
232*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_GE(pcnt, 1, "should have at least 1 processor set");
233*0f4c859eSApple OSS Distributions
234*0f4c859eSApple OSS Distributions kr = host_processor_set_priv(host, psets[0], &pset_priv);
235*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "host_processor_set_priv");
236*0f4c859eSApple OSS Distributions for (size_t i = 0; i < pcnt; i++) {
237*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), psets[i]);
238*0f4c859eSApple OSS Distributions }
239*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), host);
240*0f4c859eSApple OSS Distributions
241*0f4c859eSApple OSS Distributions kr = processor_set_tasks_with_flavor(pset_priv, flavor, &taskList, &tcnt);
242*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "processor_set_tasks_with_flavor");
243*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_GE(tcnt, 1, "should have at least 1 task");
244*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), pset_priv);
245*0f4c859eSApple OSS Distributions
246*0f4c859eSApple OSS Distributions for (size_t i = 0; i < tcnt; i++) {
247*0f4c859eSApple OSS Distributions kr = mach_port_kernel_object(mach_task_self(), taskList[i], &kotype, &kaddr);
248*0f4c859eSApple OSS Distributions if (kr == KERN_INVALID_RIGHT || kr == KERN_INVALID_NAME) {
249*0f4c859eSApple OSS Distributions /* task port is inactive */
250*0f4c859eSApple OSS Distributions T_LOG("task port name 0x%x is inactive", taskList[i]);
251*0f4c859eSApple OSS Distributions continue;
252*0f4c859eSApple OSS Distributions } else if (kr) {
253*0f4c859eSApple OSS Distributions T_FAIL("mach_port_kernel_object() failed with kr: 0x%x", kr);
254*0f4c859eSApple OSS Distributions }
255*0f4c859eSApple OSS Distributions switch (flavor) {
256*0f4c859eSApple OSS Distributions case TASK_FLAVOR_CONTROL:
257*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_TASK_CONTROL, "TASK_FLAVOR_CONTROL should yield control ports");
258*0f4c859eSApple OSS Distributions break;
259*0f4c859eSApple OSS Distributions case TASK_FLAVOR_READ:
260*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_TASK_READ, "TASK_FLAVOR_READ should yield read ports");
261*0f4c859eSApple OSS Distributions break;
262*0f4c859eSApple OSS Distributions case TASK_FLAVOR_INSPECT:
263*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_TASK_INSPECT, "TASK_FLAVOR_INSPECT should yield inspect ports");
264*0f4c859eSApple OSS Distributions break;
265*0f4c859eSApple OSS Distributions case TASK_FLAVOR_NAME:
266*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(kotype, IKOT_TASK_NAME, "TASK_FLAVOR_NAME should yield name ports");
267*0f4c859eSApple OSS Distributions break;
268*0f4c859eSApple OSS Distributions default:
269*0f4c859eSApple OSS Distributions T_FAIL("strange flavor");
270*0f4c859eSApple OSS Distributions break;
271*0f4c859eSApple OSS Distributions }
272*0f4c859eSApple OSS Distributions }
273*0f4c859eSApple OSS Distributions
274*0f4c859eSApple OSS Distributions for (size_t i = 0; i < tcnt; i++) {
275*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), taskList[i]);
276*0f4c859eSApple OSS Distributions }
277*0f4c859eSApple OSS Distributions }
278*0f4c859eSApple OSS Distributions
279*0f4c859eSApple OSS Distributions static void
test_task_port_mig_intrans(task_t tport,task_flavor_t flavor)280*0f4c859eSApple OSS Distributions test_task_port_mig_intrans(
281*0f4c859eSApple OSS Distributions task_t tport,
282*0f4c859eSApple OSS Distributions task_flavor_t flavor)
283*0f4c859eSApple OSS Distributions {
284*0f4c859eSApple OSS Distributions kern_return_t kr;
285*0f4c859eSApple OSS Distributions
286*0f4c859eSApple OSS Distributions T_LOG("Testing various MIG/manual intrans task interfaces with task flavor %d", flavor);
287*0f4c859eSApple OSS Distributions
288*0f4c859eSApple OSS Distributions {
289*0f4c859eSApple OSS Distributions /* 1. Test some control port interfaces */
290*0f4c859eSApple OSS Distributions int data = 0x41;
291*0f4c859eSApple OSS Distributions int new_value = 0x42;
292*0f4c859eSApple OSS Distributions kr = mach_vm_write(tport,
293*0f4c859eSApple OSS Distributions (mach_vm_address_t)&data,
294*0f4c859eSApple OSS Distributions (vm_offset_t)&new_value,
295*0f4c859eSApple OSS Distributions (mach_msg_type_number_t)sizeof(int));
296*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_CONTROL, "mach_vm_write");
297*0f4c859eSApple OSS Distributions
298*0f4c859eSApple OSS Distributions /* mach_vm_remap_new with max_protection VM_PROT_WRITE | VM_PROT_READ */
299*0f4c859eSApple OSS Distributions int *localAddress = 0;
300*0f4c859eSApple OSS Distributions mach_vm_address_t localMachVMAddress = 0;
301*0f4c859eSApple OSS Distributions vm_prot_t cur_protection = VM_PROT_WRITE | VM_PROT_READ;
302*0f4c859eSApple OSS Distributions vm_prot_t max_protection = VM_PROT_WRITE | VM_PROT_READ;
303*0f4c859eSApple OSS Distributions /* rdar://67706101 (mach_vm_remap flag that allows restricting protection of remapped region) */
304*0f4c859eSApple OSS Distributions kr = mach_vm_remap_new(mach_task_self(),
305*0f4c859eSApple OSS Distributions &localMachVMAddress,
306*0f4c859eSApple OSS Distributions sizeof(int),
307*0f4c859eSApple OSS Distributions 0,
308*0f4c859eSApple OSS Distributions VM_FLAGS_ANYWHERE,
309*0f4c859eSApple OSS Distributions tport, /* remote task, use self task port */
310*0f4c859eSApple OSS Distributions (mach_vm_address_t)&data,
311*0f4c859eSApple OSS Distributions false,
312*0f4c859eSApple OSS Distributions &cur_protection,
313*0f4c859eSApple OSS Distributions &max_protection,
314*0f4c859eSApple OSS Distributions VM_INHERIT_NONE);
315*0f4c859eSApple OSS Distributions localAddress = (int *)(uintptr_t)localMachVMAddress;
316*0f4c859eSApple OSS Distributions
317*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_CONTROL, "mach_vm_remap_new - VM_PROT_WRITE");
318*0f4c859eSApple OSS Distributions if (KERN_SUCCESS == kr) {
319*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(max_protection, VM_PROT_READ | VM_PROT_WRITE, NULL);
320*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(cur_protection, VM_PROT_READ | VM_PROT_WRITE, NULL);
321*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(*localAddress, data, NULL); /* read */
322*0f4c859eSApple OSS Distributions *localAddress = 0; /* write */
323*0f4c859eSApple OSS Distributions }
324*0f4c859eSApple OSS Distributions
325*0f4c859eSApple OSS Distributions exception_mask_t masks[EXC_TYPES_COUNT] = {};
326*0f4c859eSApple OSS Distributions mach_msg_type_number_t nmasks = 0;
327*0f4c859eSApple OSS Distributions exception_port_t ports[EXC_TYPES_COUNT] = {};
328*0f4c859eSApple OSS Distributions exception_behavior_t behaviors[EXC_TYPES_COUNT] = {};
329*0f4c859eSApple OSS Distributions thread_state_flavor_t flavors[EXC_TYPES_COUNT] = {};
330*0f4c859eSApple OSS Distributions kr = task_get_exception_ports(tport, EXC_MASK_ALL,
331*0f4c859eSApple OSS Distributions masks, &nmasks, ports, behaviors, flavors);
332*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_CONTROL, "task_get_exception_ports");
333*0f4c859eSApple OSS Distributions for (size_t i = 0; i < EXC_TYPES_COUNT; i++) {
334*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), ports[i]);
335*0f4c859eSApple OSS Distributions }
336*0f4c859eSApple OSS Distributions }
337*0f4c859eSApple OSS Distributions
338*0f4c859eSApple OSS Distributions {
339*0f4c859eSApple OSS Distributions /* 2. Test some read port interfaces */
340*0f4c859eSApple OSS Distributions vm_offset_t read_value = 0;
341*0f4c859eSApple OSS Distributions mach_msg_type_number_t read_cnt = 0;
342*0f4c859eSApple OSS Distributions int data = 0x41;
343*0f4c859eSApple OSS Distributions kr = mach_vm_read(tport,
344*0f4c859eSApple OSS Distributions (mach_vm_address_t)&data,
345*0f4c859eSApple OSS Distributions (mach_msg_type_number_t)sizeof(int),
346*0f4c859eSApple OSS Distributions &read_value,
347*0f4c859eSApple OSS Distributions &read_cnt);
348*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_READ, "mach_vm_read");
349*0f4c859eSApple OSS Distributions
350*0f4c859eSApple OSS Distributions /* mach_vm_remap_new with max_protection VM_PROT_READ */
351*0f4c859eSApple OSS Distributions int *localAddress = 0;
352*0f4c859eSApple OSS Distributions mach_vm_address_t localMachVMAddress = 0;
353*0f4c859eSApple OSS Distributions vm_prot_t cur_protection = VM_PROT_READ;
354*0f4c859eSApple OSS Distributions vm_prot_t max_protection = VM_PROT_READ;
355*0f4c859eSApple OSS Distributions /* rdar://67706101 (mach_vm_remap flag that allows restricting protection of remapped region) */
356*0f4c859eSApple OSS Distributions kr = mach_vm_remap_new(mach_task_self(),
357*0f4c859eSApple OSS Distributions &localMachVMAddress,
358*0f4c859eSApple OSS Distributions sizeof(int),
359*0f4c859eSApple OSS Distributions 0,
360*0f4c859eSApple OSS Distributions VM_FLAGS_ANYWHERE,
361*0f4c859eSApple OSS Distributions tport, /* remote task, use self task port */
362*0f4c859eSApple OSS Distributions (mach_vm_address_t)&data,
363*0f4c859eSApple OSS Distributions false,
364*0f4c859eSApple OSS Distributions &cur_protection,
365*0f4c859eSApple OSS Distributions &max_protection,
366*0f4c859eSApple OSS Distributions VM_INHERIT_NONE);
367*0f4c859eSApple OSS Distributions localAddress = (int *)(uintptr_t)localMachVMAddress;
368*0f4c859eSApple OSS Distributions
369*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_READ, "mach_vm_remap_new - VM_PROT_READ");
370*0f4c859eSApple OSS Distributions if (KERN_SUCCESS == kr) {
371*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(max_protection, VM_PROT_READ, NULL);
372*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(cur_protection, VM_PROT_READ, NULL);
373*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(*localAddress, data, NULL); /* read */
374*0f4c859eSApple OSS Distributions }
375*0f4c859eSApple OSS Distributions
376*0f4c859eSApple OSS Distributions /* mach_vm_remap_new with copy == TRUE */
377*0f4c859eSApple OSS Distributions int data2 = 0x42;
378*0f4c859eSApple OSS Distributions localAddress = 0;
379*0f4c859eSApple OSS Distributions localMachVMAddress = 0;
380*0f4c859eSApple OSS Distributions cur_protection = VM_PROT_WRITE | VM_PROT_READ;
381*0f4c859eSApple OSS Distributions max_protection = VM_PROT_WRITE | VM_PROT_READ;
382*0f4c859eSApple OSS Distributions
383*0f4c859eSApple OSS Distributions kr = mach_vm_remap_new(mach_task_self(),
384*0f4c859eSApple OSS Distributions &localMachVMAddress,
385*0f4c859eSApple OSS Distributions sizeof(int),
386*0f4c859eSApple OSS Distributions 0,
387*0f4c859eSApple OSS Distributions VM_FLAGS_ANYWHERE,
388*0f4c859eSApple OSS Distributions tport, /* remote task, use self task port */
389*0f4c859eSApple OSS Distributions (mach_vm_address_t)&data2,
390*0f4c859eSApple OSS Distributions true,
391*0f4c859eSApple OSS Distributions &cur_protection,
392*0f4c859eSApple OSS Distributions &max_protection,
393*0f4c859eSApple OSS Distributions VM_INHERIT_NONE);
394*0f4c859eSApple OSS Distributions localAddress = (int *)(uintptr_t)localMachVMAddress;
395*0f4c859eSApple OSS Distributions
396*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_READ, "mach_vm_remap_new - copy==TRUE");
397*0f4c859eSApple OSS Distributions if (KERN_SUCCESS == kr) {
398*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(max_protection, VM_PROT_READ | VM_PROT_WRITE, NULL);
399*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_EQ(cur_protection, VM_PROT_READ | VM_PROT_WRITE, NULL);
400*0f4c859eSApple OSS Distributions /* Following is causing bus error tracked by rdar://71616700 (Unexpected BUS ERROR in mach_vm_remap_new()) */
401*0f4c859eSApple OSS Distributions // T_QUIET; T_EXPECT_EQ(*localAddress, data2, NULL); /* read */
402*0f4c859eSApple OSS Distributions // *localAddress = 0; /* write */
403*0f4c859eSApple OSS Distributions }
404*0f4c859eSApple OSS Distributions
405*0f4c859eSApple OSS Distributions /* */
406*0f4c859eSApple OSS Distributions mach_port_t voucher = MACH_PORT_NULL;
407*0f4c859eSApple OSS Distributions kr = task_get_mach_voucher(tport, 0, &voucher);
408*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_READ, "task_get_mach_voucher");
409*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), voucher);
410*0f4c859eSApple OSS Distributions
411*0f4c859eSApple OSS Distributions /* */
412*0f4c859eSApple OSS Distributions ipc_info_space_t space_info;
413*0f4c859eSApple OSS Distributions ipc_info_name_array_t table;
414*0f4c859eSApple OSS Distributions mach_msg_type_number_t tableCount;
415*0f4c859eSApple OSS Distributions ipc_info_tree_name_array_t tree; /* unused */
416*0f4c859eSApple OSS Distributions mach_msg_type_number_t treeCount; /* unused */
417*0f4c859eSApple OSS Distributions kr = mach_port_space_info(tport, &space_info, &table, &tableCount, &tree, &treeCount);
418*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_READ, "mach_port_space_info");
419*0f4c859eSApple OSS Distributions }
420*0f4c859eSApple OSS Distributions
421*0f4c859eSApple OSS Distributions {
422*0f4c859eSApple OSS Distributions /* 3. Test some inspect port interfaces */
423*0f4c859eSApple OSS Distributions task_exc_guard_behavior_t exc_behavior;
424*0f4c859eSApple OSS Distributions kr = task_get_exc_guard_behavior(tport, &exc_behavior);
425*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_INSPECT, "task_get_exc_guard_behavior");
426*0f4c859eSApple OSS Distributions }
427*0f4c859eSApple OSS Distributions
428*0f4c859eSApple OSS Distributions {
429*0f4c859eSApple OSS Distributions /* 4. Test some name port interfaces */
430*0f4c859eSApple OSS Distributions struct task_basic_info info;
431*0f4c859eSApple OSS Distributions mach_msg_type_number_t size = sizeof(info);
432*0f4c859eSApple OSS Distributions kr = task_info(tport,
433*0f4c859eSApple OSS Distributions TASK_BASIC_INFO,
434*0f4c859eSApple OSS Distributions (task_info_t)&info,
435*0f4c859eSApple OSS Distributions &size);
436*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, TASK_FLAVOR_NAME, "task_info");
437*0f4c859eSApple OSS Distributions }
438*0f4c859eSApple OSS Distributions }
439*0f4c859eSApple OSS Distributions
440*0f4c859eSApple OSS Distributions static void
test_thread_port_mig_intrans(thread_t tport,thread_flavor_t flavor)441*0f4c859eSApple OSS Distributions test_thread_port_mig_intrans(
442*0f4c859eSApple OSS Distributions thread_t tport,
443*0f4c859eSApple OSS Distributions thread_flavor_t flavor)
444*0f4c859eSApple OSS Distributions {
445*0f4c859eSApple OSS Distributions kern_return_t kr;
446*0f4c859eSApple OSS Distributions
447*0f4c859eSApple OSS Distributions T_LOG("Testing various MIG/manual intrans thread interfaces with thread flavor %d", flavor);
448*0f4c859eSApple OSS Distributions
449*0f4c859eSApple OSS Distributions {
450*0f4c859eSApple OSS Distributions /* 1. Test some control port interfaces */
451*0f4c859eSApple OSS Distributions exception_mask_t masks[EXC_TYPES_COUNT] = {};
452*0f4c859eSApple OSS Distributions mach_msg_type_number_t nmasks = 0;
453*0f4c859eSApple OSS Distributions exception_port_t ports[EXC_TYPES_COUNT] = {};
454*0f4c859eSApple OSS Distributions exception_behavior_t behaviors[EXC_TYPES_COUNT] = {};;
455*0f4c859eSApple OSS Distributions thread_state_flavor_t flavors[EXC_TYPES_COUNT] = {};;
456*0f4c859eSApple OSS Distributions kr = thread_get_exception_ports(tport, EXC_MASK_ALL,
457*0f4c859eSApple OSS Distributions masks, &nmasks, ports, behaviors, flavors);
458*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, THREAD_FLAVOR_CONTROL, "thread_get_exception_ports");
459*0f4c859eSApple OSS Distributions for (size_t i = 0; i < EXC_TYPES_COUNT; i++) {
460*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), ports[i]);
461*0f4c859eSApple OSS Distributions }
462*0f4c859eSApple OSS Distributions }
463*0f4c859eSApple OSS Distributions
464*0f4c859eSApple OSS Distributions {
465*0f4c859eSApple OSS Distributions /* 2. Test some read port interfaces */
466*0f4c859eSApple OSS Distributions mach_voucher_t voucher = MACH_PORT_NULL;
467*0f4c859eSApple OSS Distributions kr = thread_get_mach_voucher(tport, 0, &voucher);
468*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, THREAD_FLAVOR_READ, "thread_get_mach_voucher");
469*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), voucher);
470*0f4c859eSApple OSS Distributions }
471*0f4c859eSApple OSS Distributions
472*0f4c859eSApple OSS Distributions {
473*0f4c859eSApple OSS Distributions /* 3. Test some inspect port interfaces */
474*0f4c859eSApple OSS Distributions thread_qos_policy_t info;
475*0f4c859eSApple OSS Distributions mach_msg_type_number_t count = THREAD_QOS_POLICY_COUNT;
476*0f4c859eSApple OSS Distributions boolean_t get_default = FALSE;
477*0f4c859eSApple OSS Distributions
478*0f4c859eSApple OSS Distributions processor_set_name_t name = MACH_PORT_NULL;
479*0f4c859eSApple OSS Distributions kr = thread_policy_get(tport, THREAD_QOS_POLICY,
480*0f4c859eSApple OSS Distributions (thread_policy_t)&info, &count, &get_default);
481*0f4c859eSApple OSS Distributions RESULT_CHECK(kr, flavor, THREAD_FLAVOR_INSPECT, "thread_policy_get");
482*0f4c859eSApple OSS Distributions }
483*0f4c859eSApple OSS Distributions }
484*0f4c859eSApple OSS Distributions
485*0f4c859eSApple OSS Distributions static void
test_get_child_task_port(void)486*0f4c859eSApple OSS Distributions test_get_child_task_port(void)
487*0f4c859eSApple OSS Distributions {
488*0f4c859eSApple OSS Distributions pid_t child_pid;
489*0f4c859eSApple OSS Distributions kern_return_t kr;
490*0f4c859eSApple OSS Distributions mach_port_name_t tr, ti, tp, tn;
491*0f4c859eSApple OSS Distributions
492*0f4c859eSApple OSS Distributions child_pid = fork();
493*0f4c859eSApple OSS Distributions
494*0f4c859eSApple OSS Distributions T_LOG("Testing get child task ports");
495*0f4c859eSApple OSS Distributions
496*0f4c859eSApple OSS Distributions if (child_pid < 0) {
497*0f4c859eSApple OSS Distributions T_FAIL("fork failed in test_get_child_port.");
498*0f4c859eSApple OSS Distributions }
499*0f4c859eSApple OSS Distributions
500*0f4c859eSApple OSS Distributions if (child_pid == 0) {
501*0f4c859eSApple OSS Distributions /* hang the child */
502*0f4c859eSApple OSS Distributions while (1) {
503*0f4c859eSApple OSS Distributions sleep(10);
504*0f4c859eSApple OSS Distributions }
505*0f4c859eSApple OSS Distributions }
506*0f4c859eSApple OSS Distributions
507*0f4c859eSApple OSS Distributions kr = task_for_pid(mach_task_self(), child_pid, &tp);
508*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "task_for_pid for child %u", child_pid);
509*0f4c859eSApple OSS Distributions
510*0f4c859eSApple OSS Distributions kr = task_read_for_pid(mach_task_self(), child_pid, &tr);
511*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "task_read_for_pid for child %u", child_pid);
512*0f4c859eSApple OSS Distributions
513*0f4c859eSApple OSS Distributions kr = task_inspect_for_pid(mach_task_self(), child_pid, &ti);
514*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "task_inspect_for_pid for child %u", child_pid);
515*0f4c859eSApple OSS Distributions
516*0f4c859eSApple OSS Distributions kr = task_name_for_pid(mach_task_self(), child_pid, &tn);
517*0f4c859eSApple OSS Distributions T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "task_name_for_pid for child %u", child_pid);
518*0f4c859eSApple OSS Distributions
519*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tp);
520*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tr);
521*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), ti);
522*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), tn);
523*0f4c859eSApple OSS Distributions
524*0f4c859eSApple OSS Distributions kill(child_pid, SIGKILL);
525*0f4c859eSApple OSS Distributions int status;
526*0f4c859eSApple OSS Distributions wait(&status);
527*0f4c859eSApple OSS Distributions }
528*0f4c859eSApple OSS Distributions
529*0f4c859eSApple OSS Distributions T_DECL(read_inspect, "Test critical read and inspect port interfaces")
530*0f4c859eSApple OSS Distributions {
531*0f4c859eSApple OSS Distributions mach_port_t control_port, movable_port, read_port, inspect_port, name_port;
532*0f4c859eSApple OSS Distributions mach_port_t th_control_port, th_movable_port, th_read_port, th_inspect_port;
533*0f4c859eSApple OSS Distributions #define TASK_PORT_COUNT 5
534*0f4c859eSApple OSS Distributions #define THREAD_PORT_COUNT 4
535*0f4c859eSApple OSS Distributions mach_port_t task_ports[TASK_PORT_COUNT];
536*0f4c859eSApple OSS Distributions task_flavor_t task_flavors[TASK_PORT_COUNT];
537*0f4c859eSApple OSS Distributions mach_port_t thread_ports[THREAD_PORT_COUNT];
538*0f4c859eSApple OSS Distributions thread_flavor_t thread_flavors[THREAD_PORT_COUNT];
539*0f4c859eSApple OSS Distributions kern_return_t kr;
540*0f4c859eSApple OSS Distributions
541*0f4c859eSApple OSS Distributions /* first, try getting all flavors of task port for self */
542*0f4c859eSApple OSS Distributions kr = task_for_pid(mach_task_self(), getpid(), &control_port);
543*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_for_pid()");
544*0f4c859eSApple OSS Distributions task_ports[0] = control_port;
545*0f4c859eSApple OSS Distributions task_flavors[0] = TASK_FLAVOR_CONTROL;
546*0f4c859eSApple OSS Distributions
547*0f4c859eSApple OSS Distributions kr = task_get_special_port(mach_task_self(), TASK_KERNEL_PORT, &movable_port);
548*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_get_special_port(..TASK_KERNEL_PORT..)");
549*0f4c859eSApple OSS Distributions task_ports[1] = movable_port;
550*0f4c859eSApple OSS Distributions task_flavors[1] = TASK_FLAVOR_CONTROL;
551*0f4c859eSApple OSS Distributions
552*0f4c859eSApple OSS Distributions kr = task_read_for_pid(mach_task_self(), getpid(), &read_port);
553*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_read_for_pid()");
554*0f4c859eSApple OSS Distributions task_ports[2] = read_port;
555*0f4c859eSApple OSS Distributions task_flavors[2] = TASK_FLAVOR_READ;
556*0f4c859eSApple OSS Distributions
557*0f4c859eSApple OSS Distributions kr = task_inspect_for_pid(mach_task_self(), getpid(), &inspect_port);
558*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_inspect_for_pid()");
559*0f4c859eSApple OSS Distributions task_ports[3] = inspect_port;
560*0f4c859eSApple OSS Distributions task_flavors[3] = TASK_FLAVOR_INSPECT;
561*0f4c859eSApple OSS Distributions
562*0f4c859eSApple OSS Distributions kr = task_name_for_pid(mach_task_self(), getpid(), &name_port);
563*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "task_name_for_pid()");
564*0f4c859eSApple OSS Distributions task_ports[4] = name_port;
565*0f4c859eSApple OSS Distributions task_flavors[4] = TASK_FLAVOR_NAME;
566*0f4c859eSApple OSS Distributions
567*0f4c859eSApple OSS Distributions
568*0f4c859eSApple OSS Distributions for (size_t i = 0; i < TASK_PORT_COUNT; i++) {
569*0f4c859eSApple OSS Distributions /*
570*0f4c859eSApple OSS Distributions * 1. Make sure can't get higher priv'ed ports from lower ones through
571*0f4c859eSApple OSS Distributions * task_get_special_port()
572*0f4c859eSApple OSS Distributions */
573*0f4c859eSApple OSS Distributions test_task_get_special_port(task_ports[i], task_flavors[i]);
574*0f4c859eSApple OSS Distributions
575*0f4c859eSApple OSS Distributions /*
576*0f4c859eSApple OSS Distributions * 2. Make sure correct level of thread ports are returned from task_threads
577*0f4c859eSApple OSS Distributions */
578*0f4c859eSApple OSS Distributions test_task_threads(task_ports[i], task_flavors[i]);
579*0f4c859eSApple OSS Distributions
580*0f4c859eSApple OSS Distributions /*
581*0f4c859eSApple OSS Distributions * 3. Make sure correct level of task ports are returned from processor_set_tasks
582*0f4c859eSApple OSS Distributions */
583*0f4c859eSApple OSS Distributions if (i >= 1) {
584*0f4c859eSApple OSS Distributions test_processor_set_tasks(task_flavors[i]);
585*0f4c859eSApple OSS Distributions }
586*0f4c859eSApple OSS Distributions
587*0f4c859eSApple OSS Distributions /*
588*0f4c859eSApple OSS Distributions * 4. Make sure our MIG intrans enforcement for tasks does not break.
589*0f4c859eSApple OSS Distributions */
590*0f4c859eSApple OSS Distributions test_task_port_mig_intrans(task_ports[i], task_flavors[i]);
591*0f4c859eSApple OSS Distributions }
592*0f4c859eSApple OSS Distributions
593*0f4c859eSApple OSS Distributions
594*0f4c859eSApple OSS Distributions for (size_t i = 0; i < TASK_PORT_COUNT; i++) {
595*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), task_ports[i]);
596*0f4c859eSApple OSS Distributions }
597*0f4c859eSApple OSS Distributions
598*0f4c859eSApple OSS Distributions /* 4. Try spawning a child an get its task ports */
599*0f4c859eSApple OSS Distributions test_get_child_task_port();
600*0f4c859eSApple OSS Distributions
601*0f4c859eSApple OSS Distributions /* Now, test thread read/inspect ports */
602*0f4c859eSApple OSS Distributions th_control_port = mach_thread_self();
603*0f4c859eSApple OSS Distributions thread_ports[0] = th_control_port;
604*0f4c859eSApple OSS Distributions thread_flavors[0] = THREAD_FLAVOR_CONTROL;
605*0f4c859eSApple OSS Distributions
606*0f4c859eSApple OSS Distributions kr = thread_get_special_port(th_control_port, THREAD_KERNEL_PORT, &th_movable_port);
607*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "thread_get_special_port(..THREAD_KERNEL_PORT..)");
608*0f4c859eSApple OSS Distributions thread_ports[1] = th_movable_port;
609*0f4c859eSApple OSS Distributions thread_flavors[1] = THREAD_FLAVOR_CONTROL;
610*0f4c859eSApple OSS Distributions
611*0f4c859eSApple OSS Distributions kr = thread_get_special_port(th_control_port, THREAD_READ_PORT, &th_read_port);
612*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "thread_get_special_port(..THREAD_READ_PORT..)");
613*0f4c859eSApple OSS Distributions thread_ports[2] = th_read_port;
614*0f4c859eSApple OSS Distributions thread_flavors[2] = THREAD_FLAVOR_READ;
615*0f4c859eSApple OSS Distributions
616*0f4c859eSApple OSS Distributions kr = thread_get_special_port(th_control_port, THREAD_INSPECT_PORT, &th_inspect_port);
617*0f4c859eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "thread_get_special_port(..THREAD_INSPECT_PORT..)");
618*0f4c859eSApple OSS Distributions thread_ports[3] = th_inspect_port;
619*0f4c859eSApple OSS Distributions thread_flavors[3] = THREAD_FLAVOR_INSPECT;
620*0f4c859eSApple OSS Distributions
621*0f4c859eSApple OSS Distributions
622*0f4c859eSApple OSS Distributions for (size_t i = 0; i < THREAD_PORT_COUNT; i++) {
623*0f4c859eSApple OSS Distributions /*
624*0f4c859eSApple OSS Distributions * 1. Make sure can't get higher priv'ed ports from lower ones through
625*0f4c859eSApple OSS Distributions * thread_get_special_port()
626*0f4c859eSApple OSS Distributions */
627*0f4c859eSApple OSS Distributions test_thread_get_special_port(thread_ports[i], thread_flavors[i]);
628*0f4c859eSApple OSS Distributions
629*0f4c859eSApple OSS Distributions /*
630*0f4c859eSApple OSS Distributions * 2. Make sure our MIG intrans enforcement for threads does not break.
631*0f4c859eSApple OSS Distributions */
632*0f4c859eSApple OSS Distributions test_thread_port_mig_intrans(thread_ports[i], thread_flavors[i]);
633*0f4c859eSApple OSS Distributions }
634*0f4c859eSApple OSS Distributions
635*0f4c859eSApple OSS Distributions for (size_t i = 0; i < THREAD_PORT_COUNT; i++) {
636*0f4c859eSApple OSS Distributions mach_port_deallocate(mach_task_self(), thread_ports[i]);
637*0f4c859eSApple OSS Distributions }
638*0f4c859eSApple OSS Distributions }
639