xref: /xnu-11417.121.6/tests/vm/vm_test_linkedit_permanent.c (revision a1e26a70f38d1d7daa7b49b258e2f8538ad81650)
1*a1e26a70SApple OSS Distributions #include <darwintest.h>
2*a1e26a70SApple OSS Distributions 
3*a1e26a70SApple OSS Distributions #include <stdlib.h>
4*a1e26a70SApple OSS Distributions 
5*a1e26a70SApple OSS Distributions #include <mach/mach_init.h>
6*a1e26a70SApple OSS Distributions #include <mach/mach_vm.h>
7*a1e26a70SApple OSS Distributions #include <mach/vm_map.h>
8*a1e26a70SApple OSS Distributions 
9*a1e26a70SApple OSS Distributions T_GLOBAL_META(
10*a1e26a70SApple OSS Distributions 	T_META_NAMESPACE("xnu.vm"),
11*a1e26a70SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
12*a1e26a70SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("VM"));
13*a1e26a70SApple OSS Distributions 
14*a1e26a70SApple OSS Distributions static char *_prot_str[] = {
15*a1e26a70SApple OSS Distributions 	/* 0 */ "---",
16*a1e26a70SApple OSS Distributions 	/* 1 */ "r--",
17*a1e26a70SApple OSS Distributions 	/* 2 */ "-w-",
18*a1e26a70SApple OSS Distributions 	/* 3 */ "rw-",
19*a1e26a70SApple OSS Distributions 	/* 4 */ "--x",
20*a1e26a70SApple OSS Distributions 	/* 5 */ "r-x",
21*a1e26a70SApple OSS Distributions 	/* 6 */ "-wx",
22*a1e26a70SApple OSS Distributions 	/* 7 */ "rwx"
23*a1e26a70SApple OSS Distributions };
24*a1e26a70SApple OSS Distributions static char *
prot_str(vm_prot_t prot)25*a1e26a70SApple OSS Distributions prot_str(vm_prot_t prot)
26*a1e26a70SApple OSS Distributions {
27*a1e26a70SApple OSS Distributions 	return _prot_str[prot & VM_PROT_ALL];
28*a1e26a70SApple OSS Distributions }
29*a1e26a70SApple OSS Distributions 
30*a1e26a70SApple OSS Distributions static void
print_region_info(mach_vm_address_t vmaddr,mach_vm_size_t vmsize,vm_region_submap_short_info_64_t ri,mach_vm_address_t vmaddr2,mach_vm_size_t vmsize2,vm_region_submap_short_info_64_t ri2)31*a1e26a70SApple OSS Distributions print_region_info(
32*a1e26a70SApple OSS Distributions 	mach_vm_address_t vmaddr,
33*a1e26a70SApple OSS Distributions 	mach_vm_size_t vmsize,
34*a1e26a70SApple OSS Distributions 	vm_region_submap_short_info_64_t ri,
35*a1e26a70SApple OSS Distributions 	mach_vm_address_t vmaddr2,
36*a1e26a70SApple OSS Distributions 	mach_vm_size_t vmsize2,
37*a1e26a70SApple OSS Distributions 	vm_region_submap_short_info_64_t ri2)
38*a1e26a70SApple OSS Distributions {
39*a1e26a70SApple OSS Distributions 	T_LOG("   [ 0x%016llx - 0x%016llx ] size 0x%016llx prot 0x%x/0x%x %s/%s submap %d\n",
40*a1e26a70SApple OSS Distributions 	    (uint64_t)vmaddr, (uint64_t)(vmaddr + vmsize), (uint64_t)vmsize,
41*a1e26a70SApple OSS Distributions 	    ri->protection, ri->max_protection,
42*a1e26a70SApple OSS Distributions 	    prot_str(ri->protection),
43*a1e26a70SApple OSS Distributions 	    prot_str(ri->max_protection),
44*a1e26a70SApple OSS Distributions 	    ri->is_submap);
45*a1e26a70SApple OSS Distributions 	if (ri2) {
46*a1e26a70SApple OSS Distributions 		T_LOG("-> [ 0x%016llx - 0x%016llx ] size 0x%016llx prot 0x%x/0x%x %s/%s submap %d\n",
47*a1e26a70SApple OSS Distributions 		    (uint64_t)vmaddr2, (uint64_t)(vmaddr2 + vmsize2),
48*a1e26a70SApple OSS Distributions 		    (uint64_t)vmsize2,
49*a1e26a70SApple OSS Distributions 		    ri2->protection, ri2->max_protection,
50*a1e26a70SApple OSS Distributions 		    prot_str(ri2->protection), prot_str(ri2->max_protection),
51*a1e26a70SApple OSS Distributions 		    ri2->is_submap);
52*a1e26a70SApple OSS Distributions 	}
53*a1e26a70SApple OSS Distributions }
54*a1e26a70SApple OSS Distributions 
55*a1e26a70SApple OSS Distributions static bool
find_first_read_only_mapping(mach_vm_address_t * vmaddr_p,mach_vm_size_t * vmsize_p,vm_region_submap_short_info_64_t ri)56*a1e26a70SApple OSS Distributions find_first_read_only_mapping(
57*a1e26a70SApple OSS Distributions 	mach_vm_address_t *vmaddr_p,
58*a1e26a70SApple OSS Distributions 	mach_vm_size_t *vmsize_p,
59*a1e26a70SApple OSS Distributions 	vm_region_submap_short_info_64_t ri)
60*a1e26a70SApple OSS Distributions {
61*a1e26a70SApple OSS Distributions 	kern_return_t kr;
62*a1e26a70SApple OSS Distributions 	mach_vm_address_t vmaddr;
63*a1e26a70SApple OSS Distributions 	mach_vm_size_t vmsize;
64*a1e26a70SApple OSS Distributions 	natural_t depth;
65*a1e26a70SApple OSS Distributions 	mach_msg_type_number_t count;
66*a1e26a70SApple OSS Distributions 
67*a1e26a70SApple OSS Distributions 	T_LOG("===== Looking for first read-only mapping");
68*a1e26a70SApple OSS Distributions 	/* find the first read-only mapping */
69*a1e26a70SApple OSS Distributions 	for (vmaddr = 0;; vmaddr += vmsize) {
70*a1e26a70SApple OSS Distributions 		depth = 0;
71*a1e26a70SApple OSS Distributions 		count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
72*a1e26a70SApple OSS Distributions 		kr = mach_vm_region_recurse(mach_task_self(),
73*a1e26a70SApple OSS Distributions 		    &vmaddr,
74*a1e26a70SApple OSS Distributions 		    &vmsize,
75*a1e26a70SApple OSS Distributions 		    &depth,
76*a1e26a70SApple OSS Distributions 		    (vm_region_recurse_info_t)ri,
77*a1e26a70SApple OSS Distributions 		    &count);
78*a1e26a70SApple OSS Distributions 		T_QUIET; T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr);
79*a1e26a70SApple OSS Distributions 		if (kr != KERN_SUCCESS) {
80*a1e26a70SApple OSS Distributions 			/* end of address space */
81*a1e26a70SApple OSS Distributions 			T_FAIL("could not find first read-only mapping");
82*a1e26a70SApple OSS Distributions 			return false;
83*a1e26a70SApple OSS Distributions 		}
84*a1e26a70SApple OSS Distributions 		if (ri->is_submap) {
85*a1e26a70SApple OSS Distributions 			/* submap: keep looking */
86*a1e26a70SApple OSS Distributions 			continue;
87*a1e26a70SApple OSS Distributions 		}
88*a1e26a70SApple OSS Distributions 		if (ri->max_protection != VM_PROT_READ) {
89*a1e26a70SApple OSS Distributions 			/* not read-only: keep looking */
90*a1e26a70SApple OSS Distributions 			continue;
91*a1e26a70SApple OSS Distributions 		}
92*a1e26a70SApple OSS Distributions 		T_PASS("Found first read-only mapping at 0x%llx size 0x%llx\n", (uint64_t)vmaddr, (uint64_t)vmsize);
93*a1e26a70SApple OSS Distributions 		*vmaddr_p = vmaddr;
94*a1e26a70SApple OSS Distributions 		*vmsize_p = vmsize;
95*a1e26a70SApple OSS Distributions 		return true;
96*a1e26a70SApple OSS Distributions 	}
97*a1e26a70SApple OSS Distributions 	return false;
98*a1e26a70SApple OSS Distributions }
99*a1e26a70SApple OSS Distributions 
100*a1e26a70SApple OSS Distributions T_DECL(vm_test_linkedit_permanent, "Tests that LINKEDIT mapping can't be overwritten", T_META_TAG_VM_PREFERRED)
101*a1e26a70SApple OSS Distributions {
102*a1e26a70SApple OSS Distributions 	kern_return_t kr;
103*a1e26a70SApple OSS Distributions 	mach_vm_address_t vmaddr, vmaddr_linkedit, vmaddr_tmp, vmaddr_buf;
104*a1e26a70SApple OSS Distributions 	mach_vm_size_t vmsize, vmsize_linkedit, vmsize_tmp;
105*a1e26a70SApple OSS Distributions 	natural_t depth1, depth2;
106*a1e26a70SApple OSS Distributions 	mach_msg_type_number_t count;
107*a1e26a70SApple OSS Distributions 	vm_region_submap_short_info_data_64_t ri1, ri2;
108*a1e26a70SApple OSS Distributions 	vm_prot_t cur_prot, max_prot;
109*a1e26a70SApple OSS Distributions 
110*a1e26a70SApple OSS Distributions #if __x86_64__
111*a1e26a70SApple OSS Distributions 	T_SKIP("x86_64: LINKEDIT mappings are not protected");
112*a1e26a70SApple OSS Distributions 	return;
113*a1e26a70SApple OSS Distributions #endif /* __x86_64 */
114*a1e26a70SApple OSS Distributions 
115*a1e26a70SApple OSS Distributions #define ASSERT_UNCHANGED(clip_ok, object_change_ok)                     \
116*a1e26a70SApple OSS Distributions 	do {                                                            \
117*a1e26a70SApple OSS Distributions 	        if (clip_ok) {                                          \
118*a1e26a70SApple OSS Distributions 	                T_EXPECT_GE(vmaddr_tmp, vmaddr,                 \
119*a1e26a70SApple OSS Distributions 	                    "vmaddr clipped 0x%llx -> 0x%llx",          \
120*a1e26a70SApple OSS Distributions 	                    (uint64_t)vmaddr, (uint64_t)vmaddr_tmp);    \
121*a1e26a70SApple OSS Distributions 	                T_EXPECT_LE(vmsize_tmp, vmsize,                 \
122*a1e26a70SApple OSS Distributions 	                    "vmsize clipped 0x%llx -> 0x%llx",          \
123*a1e26a70SApple OSS Distributions 	                    (uint64_t)vmsize, (uint64_t)vmsize_tmp);    \
124*a1e26a70SApple OSS Distributions 	        } else {                                                \
125*a1e26a70SApple OSS Distributions 	                T_EXPECT_EQ(vmaddr_tmp, vmaddr,                 \
126*a1e26a70SApple OSS Distributions 	                    "vmaddr unchanged 0x%llx -> 0x%llx",        \
127*a1e26a70SApple OSS Distributions 	                    (uint64_t)vmaddr, (uint64_t)vmaddr_tmp);    \
128*a1e26a70SApple OSS Distributions 	                T_EXPECT_EQ(vmsize_tmp, vmsize,                 \
129*a1e26a70SApple OSS Distributions 	                            "vmsize unchanged 0x%llx -> 0x%llx", \
130*a1e26a70SApple OSS Distributions 	                            (uint64_t)vmsize, (uint64_t)vmsize_tmp); \
131*a1e26a70SApple OSS Distributions 	        }                                                       \
132*a1e26a70SApple OSS Distributions 	        T_EXPECT_LE(ri2.protection, VM_PROT_READ,               \
133*a1e26a70SApple OSS Distributions 	                    "should not become writable");              \
134*a1e26a70SApple OSS Distributions 	        T_EXPECT_LE(ri2.max_protection, VM_PROT_READ,           \
135*a1e26a70SApple OSS Distributions 	                    "should not become able to become writable"); \
136*a1e26a70SApple OSS Distributions 	        if (!object_change_ok) {                                \
137*a1e26a70SApple OSS Distributions 	                T_EXPECT_EQ(ri2.object_id, ri1.object_id,       \
138*a1e26a70SApple OSS Distributions 	                            "object id should not change");     \
139*a1e26a70SApple OSS Distributions 	        }                                                       \
140*a1e26a70SApple OSS Distributions 	} while (0)
141*a1e26a70SApple OSS Distributions 
142*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
143*a1e26a70SApple OSS Distributions 	if (!find_first_read_only_mapping(&vmaddr_linkedit, &vmsize_linkedit, &ri2)) {
144*a1e26a70SApple OSS Distributions 		T_FAIL("could not find appropriate mapping");
145*a1e26a70SApple OSS Distributions 		return;
146*a1e26a70SApple OSS Distributions 	}
147*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
148*a1e26a70SApple OSS Distributions 	/* get top-level mapping protections */
149*a1e26a70SApple OSS Distributions 	vmaddr = vmaddr_linkedit;
150*a1e26a70SApple OSS Distributions 	depth1 = 0;
151*a1e26a70SApple OSS Distributions 	count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
152*a1e26a70SApple OSS Distributions 	kr = mach_vm_region_recurse(mach_task_self(),
153*a1e26a70SApple OSS Distributions 	    &vmaddr,
154*a1e26a70SApple OSS Distributions 	    &vmsize,
155*a1e26a70SApple OSS Distributions 	    &depth1,
156*a1e26a70SApple OSS Distributions 	    (vm_region_recurse_info_t)&ri1,
157*a1e26a70SApple OSS Distributions 	    &count);
158*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
159*a1e26a70SApple OSS Distributions 	print_region_info(vmaddr, vmsize, &ri1, vmaddr_linkedit, vmsize_linkedit, &ri2);
160*a1e26a70SApple OSS Distributions 
161*a1e26a70SApple OSS Distributions 
162*a1e26a70SApple OSS Distributions 
163*a1e26a70SApple OSS Distributions 	/* vm_write() on LINKEDIT mapping */
164*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
165*a1e26a70SApple OSS Distributions 	T_LOG("===== vm_write() on LINKEDIT mapping");
166*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
167*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri1.is_submap, 0, "mapping should be nested");
168*a1e26a70SApple OSS Distributions 	/* get a temporary buffer */
169*a1e26a70SApple OSS Distributions 	kr = mach_vm_allocate(mach_task_self(),
170*a1e26a70SApple OSS Distributions 	    &vmaddr_buf,
171*a1e26a70SApple OSS Distributions 	    vmsize_linkedit,
172*a1e26a70SApple OSS Distributions 	    VM_FLAGS_ANYWHERE);
173*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_SUCCESS(kr, "vm_allocate(0x%llx)", vmsize_linkedit);
174*a1e26a70SApple OSS Distributions 	/* copy the data to avoid undue crash */
175*a1e26a70SApple OSS Distributions 	memcpy((char *)(uintptr_t)vmaddr_buf,
176*a1e26a70SApple OSS Distributions 	    (char *)(uintptr_t)vmaddr_linkedit,
177*a1e26a70SApple OSS Distributions 	    (size_t)vmsize_linkedit);
178*a1e26a70SApple OSS Distributions 	kr = mach_vm_write(mach_task_self(),
179*a1e26a70SApple OSS Distributions 	    vmaddr_linkedit,           /* destination address */
180*a1e26a70SApple OSS Distributions 	    vmaddr_buf,                /* source buffer */
181*a1e26a70SApple OSS Distributions 	    (mach_msg_type_number_t) vmsize_linkedit);
182*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_ERROR(kr, KERN_PROTECTION_FAILURE,
183*a1e26a70SApple OSS Distributions 	    "vm_write() on LINKEDIT mapping fails with KERN_PROTECTION_FAILURE");
184*a1e26a70SApple OSS Distributions 	/* check protections again */
185*a1e26a70SApple OSS Distributions 	depth2 = 0;
186*a1e26a70SApple OSS Distributions 	count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
187*a1e26a70SApple OSS Distributions 	vmaddr_tmp = vmaddr_linkedit;
188*a1e26a70SApple OSS Distributions 	kr = mach_vm_region_recurse(mach_task_self(),
189*a1e26a70SApple OSS Distributions 	    &vmaddr_tmp,
190*a1e26a70SApple OSS Distributions 	    &vmsize_tmp,
191*a1e26a70SApple OSS Distributions 	    &depth2,
192*a1e26a70SApple OSS Distributions 	    (vm_region_recurse_info_t)&ri2,
193*a1e26a70SApple OSS Distributions 	    &count);
194*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
195*a1e26a70SApple OSS Distributions 	print_region_info(vmaddr_linkedit, vmsize_linkedit, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
196*a1e26a70SApple OSS Distributions 	ASSERT_UNCHANGED(false, false);
197*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
198*a1e26a70SApple OSS Distributions 
199*a1e26a70SApple OSS Distributions 	/* vm_allocate(VM_FLAGS_OVERWRITE) on top of LINKEDIT */
200*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
201*a1e26a70SApple OSS Distributions 	T_LOG("===== vm_allocate(VM_FLAGS_OVERWRITE) on LINKEDIT mapping");
202*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
203*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri1.is_submap, 0, "mapping should not be nested");
204*a1e26a70SApple OSS Distributions 	vmaddr_tmp = vmaddr_linkedit;
205*a1e26a70SApple OSS Distributions 	kr = mach_vm_allocate(mach_task_self(),
206*a1e26a70SApple OSS Distributions 	    &vmaddr_tmp,
207*a1e26a70SApple OSS Distributions 	    vmsize_linkedit,
208*a1e26a70SApple OSS Distributions 	    VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE);
209*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_ERROR(kr, KERN_NO_SPACE, "vm_allocate(OVERWRITE) fails with KERN_NO_SPACE");
210*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(vmaddr_linkedit, vmaddr_tmp, "vmaddr is unchanged");
211*a1e26a70SApple OSS Distributions 	/* check protections again */
212*a1e26a70SApple OSS Distributions 	depth2 = 0;
213*a1e26a70SApple OSS Distributions 	vmaddr_tmp = vmaddr_linkedit;
214*a1e26a70SApple OSS Distributions 	count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
215*a1e26a70SApple OSS Distributions 	kr = mach_vm_region_recurse(mach_task_self(),
216*a1e26a70SApple OSS Distributions 	    &vmaddr_tmp,
217*a1e26a70SApple OSS Distributions 	    &vmsize_tmp,
218*a1e26a70SApple OSS Distributions 	    &depth2,
219*a1e26a70SApple OSS Distributions 	    (vm_region_recurse_info_t)&ri2,
220*a1e26a70SApple OSS Distributions 	    &count);
221*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
222*a1e26a70SApple OSS Distributions 	print_region_info(vmaddr, vmsize, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
223*a1e26a70SApple OSS Distributions 	ASSERT_UNCHANGED(false, false);
224*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
225*a1e26a70SApple OSS Distributions 
226*a1e26a70SApple OSS Distributions 	/* vm_remap(VM_FLAGS_OVERWRITE) on top of submap */
227*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
228*a1e26a70SApple OSS Distributions 	T_LOG("===== vm_remap(VM_FLAGS_OVERWRITE) on LINKEDIT mapping");
229*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
230*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri1.is_submap, 0, "mapping should not be nested");
231*a1e26a70SApple OSS Distributions 	vmaddr_tmp = vmaddr_linkedit;
232*a1e26a70SApple OSS Distributions 	kr = mach_vm_remap(mach_task_self(),
233*a1e26a70SApple OSS Distributions 	    &vmaddr_tmp,
234*a1e26a70SApple OSS Distributions 	    vmsize_linkedit,
235*a1e26a70SApple OSS Distributions 	    0,
236*a1e26a70SApple OSS Distributions 	    VM_FLAGS_FIXED | VM_FLAGS_OVERWRITE,
237*a1e26a70SApple OSS Distributions 	    mach_task_self(),
238*a1e26a70SApple OSS Distributions 	    vmaddr_buf,
239*a1e26a70SApple OSS Distributions 	    TRUE,
240*a1e26a70SApple OSS Distributions 	    &cur_prot,
241*a1e26a70SApple OSS Distributions 	    &max_prot,
242*a1e26a70SApple OSS Distributions 	    VM_INHERIT_DEFAULT);
243*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_ERROR(kr, KERN_NO_SPACE, "vm_remap(OVERWRITE) fails with KERN_NO_SPACE");
244*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(vmaddr_linkedit, vmaddr_tmp, "vmaddr is unchanged");
245*a1e26a70SApple OSS Distributions 	/* check protections again */
246*a1e26a70SApple OSS Distributions 	depth2 = 0;
247*a1e26a70SApple OSS Distributions 	vmaddr_tmp = vmaddr_linkedit;
248*a1e26a70SApple OSS Distributions 	count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
249*a1e26a70SApple OSS Distributions 	kr = mach_vm_region_recurse(mach_task_self(),
250*a1e26a70SApple OSS Distributions 	    &vmaddr_tmp,
251*a1e26a70SApple OSS Distributions 	    &vmsize_tmp,
252*a1e26a70SApple OSS Distributions 	    &depth2,
253*a1e26a70SApple OSS Distributions 	    (vm_region_recurse_info_t)&ri2,
254*a1e26a70SApple OSS Distributions 	    &count);
255*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
256*a1e26a70SApple OSS Distributions 	print_region_info(vmaddr, vmsize, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
257*a1e26a70SApple OSS Distributions 	ASSERT_UNCHANGED(false, false);
258*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
259*a1e26a70SApple OSS Distributions 
260*a1e26a70SApple OSS Distributions 	/* vm_protect(VM_PROT_COPY) on LINKEDIT mapping */
261*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
262*a1e26a70SApple OSS Distributions 	T_LOG("===== vm_protect(VM_PROT_COPY) on LINKEDIT mapping");
263*a1e26a70SApple OSS Distributions 	T_LOG("==========================================");
264*a1e26a70SApple OSS Distributions 	ri1 = ri2;
265*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri1.is_submap, 0, "mapping should not be nested");
266*a1e26a70SApple OSS Distributions 	kr = mach_vm_protect(mach_task_self(),
267*a1e26a70SApple OSS Distributions 	    vmaddr_linkedit,
268*a1e26a70SApple OSS Distributions 	    vmsize_linkedit,
269*a1e26a70SApple OSS Distributions 	    FALSE,                  /* set_maximum */
270*a1e26a70SApple OSS Distributions 	    VM_PROT_COPY | VM_PROT_READ | VM_PROT_WRITE);
271*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_ERROR(kr, KERN_NO_SPACE,
272*a1e26a70SApple OSS Distributions 	    "vm_protect(VM_PROT_COPY) fails with KERN_NO_SPACE");
273*a1e26a70SApple OSS Distributions 	/* check protections again */
274*a1e26a70SApple OSS Distributions 	depth2 = 0;
275*a1e26a70SApple OSS Distributions 	count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
276*a1e26a70SApple OSS Distributions 	vmaddr_tmp = vmaddr_linkedit;
277*a1e26a70SApple OSS Distributions 	kr = mach_vm_region_recurse(mach_task_self(),
278*a1e26a70SApple OSS Distributions 	    &vmaddr_tmp,
279*a1e26a70SApple OSS Distributions 	    &vmsize_tmp,
280*a1e26a70SApple OSS Distributions 	    &depth2,
281*a1e26a70SApple OSS Distributions 	    (vm_region_recurse_info_t)&ri2,
282*a1e26a70SApple OSS Distributions 	    &count);
283*a1e26a70SApple OSS Distributions 	T_EXPECT_MACH_SUCCESS(kr, "mach_vm_region_recurse(0x%llx)\n", vmaddr_linkedit);
284*a1e26a70SApple OSS Distributions 	print_region_info(vmaddr, vmsize, &ri1, vmaddr_tmp, vmsize_tmp, &ri2);
285*a1e26a70SApple OSS Distributions 	ASSERT_UNCHANGED(false, true);
286*a1e26a70SApple OSS Distributions 	T_EXPECT_EQ(ri2.is_submap, 0, "mapping should not be nested");
287*a1e26a70SApple OSS Distributions 
288*a1e26a70SApple OSS Distributions //	T_LOG("pausing..."); getchar();
289*a1e26a70SApple OSS Distributions }
290