Deleted Added
full compact
posixshm_test.c (289437) posixshm_test.c (289441)
1/*-
2 * Copyright (c) 2006 Robert N. M. Watson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2006 Robert N. M. Watson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: user/ngie/more-tests2/tests/sys/posixshm/posixshm_test.c 289437 2015-10-17 03:13:22Z ngie $");
28__FBSDID("$FreeBSD: head/tests/sys/posixshm/posixshm_test.c 289441 2015-10-17 04:32:21Z ngie $");
29
30#include <sys/param.h>
31#include <sys/mman.h>
32#include <sys/resource.h>
33#include <sys/stat.h>
34#include <sys/syscall.h>
35#include <sys/wait.h>
36

--- 68 unchanged lines hidden (view full) ---

105
106 fd = shm_open(test_path, O_CREAT|O_EXCL|O_RDWR, 0777);
107 if (fd < 0 && errno == EEXIST) {
108 if (shm_unlink(test_path) < 0)
109 atf_tc_fail("shm_unlink");
110 fd = shm_open(test_path, O_CREAT | O_EXCL | O_RDWR, 0777);
111 }
112 if (fd < 0)
29
30#include <sys/param.h>
31#include <sys/mman.h>
32#include <sys/resource.h>
33#include <sys/stat.h>
34#include <sys/syscall.h>
35#include <sys/wait.h>
36

--- 68 unchanged lines hidden (view full) ---

105
106 fd = shm_open(test_path, O_CREAT|O_EXCL|O_RDWR, 0777);
107 if (fd < 0 && errno == EEXIST) {
108 if (shm_unlink(test_path) < 0)
109 atf_tc_fail("shm_unlink");
110 fd = shm_open(test_path, O_CREAT | O_EXCL | O_RDWR, 0777);
111 }
112 if (fd < 0)
113 atf_tc_fail("shm_open");
113 atf_tc_fail("shm_open failed; errno=%d", errno);
114 if (ftruncate(fd, getpagesize()) < 0)
114 if (ftruncate(fd, getpagesize()) < 0)
115 atf_tc_fail("ftruncate");
115 atf_tc_fail("ftruncate failed; errno=%d", errno);
116
117 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
118 0);
119 if (page == MAP_FAILED)
116
117 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
118 0);
119 if (page == MAP_FAILED)
120 atf_tc_fail("mmap");
120 atf_tc_fail("mmap failed; errno=%d", errno);
121
122 page[0] = '1';
123 if (munmap(page, getpagesize()) < 0)
121
122 page[0] = '1';
123 if (munmap(page, getpagesize()) < 0)
124 atf_tc_fail("munmap");
124 atf_tc_fail("munmap failed; errno=%d", errno);
125
126 return (fd);
127}
128
129ATF_TC_WITHOUT_HEAD(remap_object);
130ATF_TC_BODY(remap_object, tc)
131{
132 char *page;
133 int fd;
134
135 fd = scribble_object();
136
137 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
138 0);
125
126 return (fd);
127}
128
129ATF_TC_WITHOUT_HEAD(remap_object);
130ATF_TC_BODY(remap_object, tc)
131{
132 char *page;
133 int fd;
134
135 fd = scribble_object();
136
137 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
138 0);
139 if (page == MAP_FAILED) {
140 atf_tc_fail("mmap(2)");
141 close(fd);
142 shm_unlink(test_path);
143 return;
144 }
139 if (page == MAP_FAILED)
140 atf_tc_fail("mmap(2) failed; errno=%d", errno);
145
141
146 if (page[0] != '1') {
147 atf_tc_fail("missing data");
148 close(fd);
149 shm_unlink(test_path);
150 return;
151 }
142 if (page[0] != '1')
143 atf_tc_fail("missing data ('%c' != '1')", page[0]);
152
153 close(fd);
144
145 close(fd);
154 if (munmap(page, getpagesize()) < 0) {
155 atf_tc_fail("munmap");
156 shm_unlink(test_path);
157 return;
158 }
146 if (munmap(page, getpagesize()) < 0)
147 atf_tc_fail("munmap failed; errno=%d", errno);
159
148
160 if (shm_unlink(test_path) < 0) {
161 atf_tc_fail("shm_unlink");
162 return;
163 }
164
149 ATF_REQUIRE_MSG(shm_unlink(test_path) != -1,
150 "shm_unlink failed; errno=%d", errno);
165}
166
167ATF_TC_WITHOUT_HEAD(reopen_object);
168ATF_TC_BODY(reopen_object, tc)
169{
170 char *page;
171 int fd;
172
173 fd = scribble_object();
174 close(fd);
175
176 fd = shm_open(test_path, O_RDONLY, 0777);
151}
152
153ATF_TC_WITHOUT_HEAD(reopen_object);
154ATF_TC_BODY(reopen_object, tc)
155{
156 char *page;
157 int fd;
158
159 fd = scribble_object();
160 close(fd);
161
162 fd = shm_open(test_path, O_RDONLY, 0777);
177 if (fd < 0) {
178 atf_tc_fail("shm_open(2)");
179 shm_unlink(test_path);
180 return;
181 }
163 if (fd < 0)
164 atf_tc_fail("shm_open(2) failed; errno=%d", errno);
165
182 page = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, fd, 0);
166 page = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, fd, 0);
183 if (page == MAP_FAILED) {
184 atf_tc_fail("mmap(2)");
185 close(fd);
186 shm_unlink(test_path);
187 return;
188 }
167 if (page == MAP_FAILED)
168 atf_tc_fail("mmap(2) failed; errno=%d", errno);
189
169
190 if (page[0] != '1') {
191 atf_tc_fail("missing data");
192 munmap(page, getpagesize());
193 close(fd);
194 shm_unlink(test_path);
195 return;
196 }
170 if (page[0] != '1')
171 atf_tc_fail("missing data ('%c' != '1')", page[0]);
197
198 munmap(page, getpagesize());
199 close(fd);
172
173 munmap(page, getpagesize());
174 close(fd);
200 shm_unlink(test_path);
175 ATF_REQUIRE_MSG(shm_unlink(test_path) != -1,
176 "shm_unlink failed; errno=%d", errno);
201}
202
203ATF_TC_WITHOUT_HEAD(readonly_mmap_write);
204ATF_TC_BODY(readonly_mmap_write, tc)
205{
206 char *page;
207 int fd;
208
209 gen_test_path();
210
211 fd = shm_open(test_path, O_RDONLY | O_CREAT, 0777);
177}
178
179ATF_TC_WITHOUT_HEAD(readonly_mmap_write);
180ATF_TC_BODY(readonly_mmap_write, tc)
181{
182 char *page;
183 int fd;
184
185 gen_test_path();
186
187 fd = shm_open(test_path, O_RDONLY | O_CREAT, 0777);
212 if (fd < 0) {
213 atf_tc_fail("shm_open");
214 return;
215 }
188 ATF_REQUIRE_MSG(fd >= 0, "shm_open failed; errno=%d", errno);
216
217 /* PROT_WRITE should fail with EACCES. */
218 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
219 0);
189
190 /* PROT_WRITE should fail with EACCES. */
191 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
192 0);
220 if (page != MAP_FAILED) {
221 atf_tc_fail("mmap(PROT_WRITE) succeeded");
222 munmap(page, getpagesize());
223 close(fd);
224 shm_unlink(test_path);
225 return;
226 }
227 if (errno != EACCES) {
228 atf_tc_fail("mmap");
229 close(fd);
230 shm_unlink(test_path);
231 return;
232 }
193 if (page != MAP_FAILED)
194 atf_tc_fail("mmap(PROT_WRITE) succeeded unexpectedly");
233
195
196 if (errno != EACCES)
197 atf_tc_fail("mmap(PROT_WRITE) didn't fail with EACCES; "
198 "errno=%d", errno);
199
234 close(fd);
200 close(fd);
235 shm_unlink(test_path);
201 ATF_REQUIRE_MSG(shm_unlink(test_path) != -1,
202 "shm_unlink failed; errno=%d", errno);
236}
237
238ATF_TC_WITHOUT_HEAD(open_after_link);
239ATF_TC_BODY(open_after_link, tc)
240{
241 int fd;
242
243 gen_test_path();
244
245 fd = shm_open(test_path, O_RDONLY | O_CREAT, 0777);
203}
204
205ATF_TC_WITHOUT_HEAD(open_after_link);
206ATF_TC_BODY(open_after_link, tc)
207{
208 int fd;
209
210 gen_test_path();
211
212 fd = shm_open(test_path, O_RDONLY | O_CREAT, 0777);
246 if (fd < 0) {
247 atf_tc_fail("shm_open(1)");
248 return;
249 }
213 ATF_REQUIRE_MSG(fd >= 0, "shm_open(1) failed; errno=%d", errno);
250 close(fd);
251
214 close(fd);
215
252 if (shm_unlink(test_path) < 0) {
253 atf_tc_fail("shm_unlink");
254 return;
255 }
216 ATF_REQUIRE_MSG(shm_unlink(test_path) != -1, "shm_unlink failed: %d",
217 errno);
256
257 shm_open_should_fail(test_path, O_RDONLY, 0777, ENOENT);
258}
259
260ATF_TC_WITHOUT_HEAD(open_invalid_path);
261ATF_TC_BODY(open_invalid_path, tc)
262{
263

--- 19 unchanged lines hidden (view full) ---

283}
284
285ATF_TC_WITHOUT_HEAD(open_anon);
286ATF_TC_BODY(open_anon, tc)
287{
288 int fd;
289
290 fd = shm_open(SHM_ANON, O_RDWR, 0777);
218
219 shm_open_should_fail(test_path, O_RDONLY, 0777, ENOENT);
220}
221
222ATF_TC_WITHOUT_HEAD(open_invalid_path);
223ATF_TC_BODY(open_invalid_path, tc)
224{
225

--- 19 unchanged lines hidden (view full) ---

245}
246
247ATF_TC_WITHOUT_HEAD(open_anon);
248ATF_TC_BODY(open_anon, tc)
249{
250 int fd;
251
252 fd = shm_open(SHM_ANON, O_RDWR, 0777);
291 if (fd < 0) {
292 atf_tc_fail("shm_open");
293 return;
294 }
253 ATF_REQUIRE_MSG(fd >= 0, "shm_open failed; errno=%d", errno);
295 close(fd);
296}
297
298ATF_TC_WITHOUT_HEAD(open_anon_readonly);
299ATF_TC_BODY(open_anon_readonly, tc)
300{
301
302 shm_open_should_fail(SHM_ANON, O_RDONLY, 0777, EINVAL);

--- 28 unchanged lines hidden (view full) ---

331ATF_TC_WITHOUT_HEAD(open_create_existing_object);
332ATF_TC_BODY(open_create_existing_object, tc)
333{
334 int fd;
335
336 gen_test_path();
337
338 fd = shm_open(test_path, O_RDONLY|O_CREAT, 0777);
254 close(fd);
255}
256
257ATF_TC_WITHOUT_HEAD(open_anon_readonly);
258ATF_TC_BODY(open_anon_readonly, tc)
259{
260
261 shm_open_should_fail(SHM_ANON, O_RDONLY, 0777, EINVAL);

--- 28 unchanged lines hidden (view full) ---

290ATF_TC_WITHOUT_HEAD(open_create_existing_object);
291ATF_TC_BODY(open_create_existing_object, tc)
292{
293 int fd;
294
295 gen_test_path();
296
297 fd = shm_open(test_path, O_RDONLY|O_CREAT, 0777);
339 ATF_REQUIRE_MSG(fd != -1, "shm_open(O_CREAT) failed; errno=%d", errno);
298 ATF_REQUIRE_MSG(fd >= 0, "shm_open failed; errno=%d", errno);
340 close(fd);
341
342 shm_open_should_fail(test_path, O_RDONLY|O_CREAT|O_EXCL,
343 0777, EEXIST);
344
299 close(fd);
300
301 shm_open_should_fail(test_path, O_RDONLY|O_CREAT|O_EXCL,
302 0777, EEXIST);
303
345 shm_unlink("shm_object");
304 ATF_REQUIRE_MSG(shm_unlink(test_path) != -1,
305 "shm_unlink failed; errno=%d", errno);
346}
347
348ATF_TC_WITHOUT_HEAD(trunc_resets_object);
349ATF_TC_BODY(trunc_resets_object, tc)
350{
351 struct stat sb;
352 int fd;
353
354 gen_test_path();
355
356 /* Create object and set size to 1024. */
357 fd = shm_open(test_path, O_RDWR | O_CREAT, 0777);
306}
307
308ATF_TC_WITHOUT_HEAD(trunc_resets_object);
309ATF_TC_BODY(trunc_resets_object, tc)
310{
311 struct stat sb;
312 int fd;
313
314 gen_test_path();
315
316 /* Create object and set size to 1024. */
317 fd = shm_open(test_path, O_RDWR | O_CREAT, 0777);
358 if (fd < 0) {
359 atf_tc_fail("shm_open(1)");
360 return;
361 }
362 if (ftruncate(fd, 1024) < 0) {
363 atf_tc_fail("ftruncate");
364 close(fd);
365 return;
366 }
367 if (fstat(fd, &sb) < 0) {
368 atf_tc_fail("fstat(1)");
369 close(fd);
370 return;
371 }
372 if (sb.st_size != 1024) {
373 atf_tc_fail("size %d != 1024", (int)sb.st_size);
374 close(fd);
375 return;
376 }
318 ATF_REQUIRE_MSG(fd >= 0, "shm_open(1) failed; errno=%d", errno);
319 ATF_REQUIRE_MSG(ftruncate(fd, 1024) != -1,
320 "ftruncate failed; errno=%d", errno);
321 ATF_REQUIRE_MSG(fstat(fd, &sb) != -1,
322 "fstat(1) failed; errno=%d", errno);
323 ATF_REQUIRE_MSG(sb.st_size == 1024, "size %d != 1024", (int)sb.st_size);
377 close(fd);
378
379 /* Open with O_TRUNC which should reset size to 0. */
380 fd = shm_open(test_path, O_RDWR | O_TRUNC, 0777);
324 close(fd);
325
326 /* Open with O_TRUNC which should reset size to 0. */
327 fd = shm_open(test_path, O_RDWR | O_TRUNC, 0777);
381 if (fd < 0) {
382 atf_tc_fail("shm_open(2)");
383 return;
384 }
385 if (fstat(fd, &sb) < 0) {
386 atf_tc_fail("fstat(2)");
387 close(fd);
388 return;
389 }
390 if (sb.st_size != 0) {
391 atf_tc_fail("size after O_TRUNC %d != 0", (int)sb.st_size);
392 close(fd);
393 return;
394 }
328 ATF_REQUIRE_MSG(fd >= 0, "shm_open(2) failed; errno=%d", errno);
329 ATF_REQUIRE_MSG(fstat(fd, &sb) != -1,
330 "fstat(2) failed; errno=%d", errno);
331 ATF_REQUIRE_MSG(sb.st_size == 0,
332 "size was not 0 after truncation: %d", (int)sb.st_size);
395 close(fd);
333 close(fd);
396 if (shm_unlink(test_path) < 0) {
397 atf_tc_fail("shm_unlink");
398 return;
399 }
334 ATF_REQUIRE_MSG(shm_unlink(test_path) != -1,
335 "shm_unlink failed; errno=%d", errno);
400}
401
402ATF_TC_WITHOUT_HEAD(unlink_bad_path_pointer);
403ATF_TC_BODY(unlink_bad_path_pointer, tc)
404{
405
406 shm_unlink_should_fail((char *)1024, EFAULT);
407}

--- 10 unchanged lines hidden (view full) ---

418 free(page);
419}
420
421ATF_TC_WITHOUT_HEAD(object_resize);
422ATF_TC_BODY(object_resize, tc)
423{
424 pid_t pid;
425 struct stat sb;
336}
337
338ATF_TC_WITHOUT_HEAD(unlink_bad_path_pointer);
339ATF_TC_BODY(unlink_bad_path_pointer, tc)
340{
341
342 shm_unlink_should_fail((char *)1024, EFAULT);
343}

--- 10 unchanged lines hidden (view full) ---

354 free(page);
355}
356
357ATF_TC_WITHOUT_HEAD(object_resize);
358ATF_TC_BODY(object_resize, tc)
359{
360 pid_t pid;
361 struct stat sb;
426 char *page;
362 char err_buf[1024], *page;
427 int fd, status;
428
429 /* Start off with a size of a single page. */
363 int fd, status;
364
365 /* Start off with a size of a single page. */
430 fd = shm_open(SHM_ANON, O_CREAT | O_RDWR, 0777);
431 if (fd < 0) {
432 atf_tc_fail("shm_open");
433 return;
434 }
435 if (ftruncate(fd, getpagesize()) < 0) {
436 atf_tc_fail("ftruncate(1)");
437 close(fd);
438 return;
439 }
440 if (fstat(fd, &sb) < 0) {
441 atf_tc_fail("fstat(1)");
442 close(fd);
443 return;
444 }
445 if (sb.st_size != getpagesize()) {
446 atf_tc_fail("first resize failed");
447 close(fd);
448 return;
449 }
366 fd = shm_open(SHM_ANON, O_CREAT|O_RDWR, 0777);
367 if (fd < 0)
368 atf_tc_fail("shm_open failed; errno=%d", errno);
450
369
370 if (ftruncate(fd, getpagesize()) < 0)
371 atf_tc_fail("ftruncate(1) failed; errno=%d", errno);
372
373 if (fstat(fd, &sb) < 0)
374 atf_tc_fail("fstat(1) failed; errno=%d", errno);
375
376 if (sb.st_size != getpagesize())
377 atf_tc_fail("first resize failed (%d != %d)",
378 (int)sb.st_size, getpagesize());
379
451 /* Write a '1' to the first byte. */
380 /* Write a '1' to the first byte. */
452 page = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
381 page = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd,
453 0);
382 0);
454 if (page == MAP_FAILED) {
383 if (page == MAP_FAILED)
455 atf_tc_fail("mmap(1)");
384 atf_tc_fail("mmap(1)");
456 close(fd);
457 return;
458 }
459
460 page[0] = '1';
461
385
386 page[0] = '1';
387
462 if (munmap(page, getpagesize()) < 0) {
463 atf_tc_fail("munmap(1)");
464 close(fd);
465 return;
466 }
388 if (munmap(page, getpagesize()) < 0)
389 atf_tc_fail("munmap(1) failed; errno=%d", errno);
467
468 /* Grow the object to 2 pages. */
390
391 /* Grow the object to 2 pages. */
469 if (ftruncate(fd, getpagesize() * 2) < 0) {
470 atf_tc_fail("ftruncate(2)");
471 close(fd);
472 return;
473 }
474 if (fstat(fd, &sb) < 0) {
475 atf_tc_fail("fstat(2)");
476 close(fd);
477 return;
478 }
479 if (sb.st_size != getpagesize() * 2) {
480 atf_tc_fail("second resize failed");
481 close(fd);
482 return;
483 }
392 if (ftruncate(fd, getpagesize() * 2) < 0)
393 atf_tc_fail("ftruncate(2) failed; errno=%d", errno);
484
394
395 if (fstat(fd, &sb) < 0)
396 atf_tc_fail("fstat(2) failed; errno=%d", errno);
397
398 if (sb.st_size != getpagesize() * 2)
399 atf_tc_fail("second resize failed (%d != %d)",
400 (int)sb.st_size, getpagesize() * 2);
401
485 /* Check for '1' at the first byte. */
402 /* Check for '1' at the first byte. */
486 page = mmap(0, getpagesize() * 2, PROT_READ | PROT_WRITE, MAP_SHARED,
403 page = mmap(0, getpagesize() * 2, PROT_READ|PROT_WRITE, MAP_SHARED,
487 fd, 0);
404 fd, 0);
488 if (page == MAP_FAILED) {
489 atf_tc_fail("mmap(2)");
490 close(fd);
491 return;
492 }
405 if (page == MAP_FAILED)
406 atf_tc_fail("mmap(2) failed; errno=%d", errno);
493
407
494 if (page[0] != '1') {
495 atf_tc_fail("missing data at 0");
496 close(fd);
497 return;
498 }
408 if (page[0] != '1')
409 atf_tc_fail("'%c' != '1'", page[0]);
499
500 /* Write a '2' at the start of the second page. */
501 page[getpagesize()] = '2';
502
503 /* Shrink the object back to 1 page. */
410
411 /* Write a '2' at the start of the second page. */
412 page[getpagesize()] = '2';
413
414 /* Shrink the object back to 1 page. */
504 if (ftruncate(fd, getpagesize()) < 0) {
505 atf_tc_fail("ftruncate(3)");
506 close(fd);
507 return;
508 }
509 if (fstat(fd, &sb) < 0) {
510 atf_tc_fail("fstat(3)");
511 close(fd);
512 return;
513 }
514 if (sb.st_size != getpagesize()) {
515 atf_tc_fail("third resize failed");
516 close(fd);
517 return;
518 }
415 if (ftruncate(fd, getpagesize()) < 0)
416 atf_tc_fail("ftruncate(3) failed; errno=%d", errno);
519
417
418 if (fstat(fd, &sb) < 0)
419 atf_tc_fail("fstat(3) failed; errno=%d", errno);
420
421 if (sb.st_size != getpagesize())
422 atf_tc_fail("third resize failed (%d != %d)",
423 (int)sb.st_size, getpagesize());
424
520 /*
521 * Fork a child process to make sure the second page is no
522 * longer valid.
523 */
524 pid = fork();
425 /*
426 * Fork a child process to make sure the second page is no
427 * longer valid.
428 */
429 pid = fork();
525 if (pid < 0) {
526 atf_tc_fail("fork");
527 close(fd);
528 return;
529 }
430 if (pid == -1)
431 atf_tc_fail("fork failed; errno=%d", errno);
530
531 if (pid == 0) {
532 struct rlimit lim;
533 char c;
534
535 /* Don't generate a core dump. */
536 getrlimit(RLIMIT_CORE, &lim);
537 lim.rlim_cur = 0;
538 setrlimit(RLIMIT_CORE, &lim);
539
540 /*
541 * The previous ftruncate(2) shrunk the backing object
542 * so that this address is no longer valid, so reading
543 * from it should trigger a SIGSEGV.
544 */
545 c = page[getpagesize()];
546 fprintf(stderr, "child: page 1: '%c'\n", c);
547 exit(0);
548 }
432
433 if (pid == 0) {
434 struct rlimit lim;
435 char c;
436
437 /* Don't generate a core dump. */
438 getrlimit(RLIMIT_CORE, &lim);
439 lim.rlim_cur = 0;
440 setrlimit(RLIMIT_CORE, &lim);
441
442 /*
443 * The previous ftruncate(2) shrunk the backing object
444 * so that this address is no longer valid, so reading
445 * from it should trigger a SIGSEGV.
446 */
447 c = page[getpagesize()];
448 fprintf(stderr, "child: page 1: '%c'\n", c);
449 exit(0);
450 }
549 if (wait(&status) < 0) {
550 atf_tc_fail("wait");
551 close(fd);
552 return;
553 }
554 if (!WIFSIGNALED(status) || WTERMSIG(status) != SIGSEGV) {
451
452 if (wait(&status) < 0)
453 atf_tc_fail("wait failed; errno=%d", errno);
454
455 if (!WIFSIGNALED(status) || WTERMSIG(status) != SIGSEGV)
555 atf_tc_fail("child terminated with status %x", status);
456 atf_tc_fail("child terminated with status %x", status);
556 close(fd);
557 return;
558 }
559
560 /* Grow the object back to 2 pages. */
457
458 /* Grow the object back to 2 pages. */
561 if (ftruncate(fd, getpagesize() * 2) < 0) {
562 atf_tc_fail("ftruncate(4)");
563 close(fd);
564 return;
565 }
566 if (fstat(fd, &sb) < 0) {
567 atf_tc_fail("fstat(4)");
568 close(fd);
569 return;
570 }
571 if (sb.st_size != getpagesize() * 2) {
572 atf_tc_fail("second resize failed");
573 close(fd);
574 return;
575 }
459 if (ftruncate(fd, getpagesize() * 2) < 0)
460 atf_tc_fail("ftruncate(2) failed; errno=%d", errno);
576
461
462 if (fstat(fd, &sb) < 0)
463 atf_tc_fail("fstat(2) failed; errno=%d", errno);
464
465 if (sb.st_size != getpagesize() * 2)
466 atf_tc_fail("fourth resize failed (%d != %d)",
467 (int)sb.st_size, getpagesize());
468
577 /*
578 * Note that the mapping at 'page' for the second page is
579 * still valid, and now that the shm object has been grown
580 * back up to 2 pages, there is now memory backing this page
581 * so the read will work. However, the data should be zero
582 * rather than '2' as the old data was thrown away when the
583 * object was shrunk and the new pages when an object are
584 * grown are zero-filled.
585 */
469 /*
470 * Note that the mapping at 'page' for the second page is
471 * still valid, and now that the shm object has been grown
472 * back up to 2 pages, there is now memory backing this page
473 * so the read will work. However, the data should be zero
474 * rather than '2' as the old data was thrown away when the
475 * object was shrunk and the new pages when an object are
476 * grown are zero-filled.
477 */
586 if (page[getpagesize()] != 0) {
587 atf_tc_fail("invalid data at %d", getpagesize());
588 close(fd);
589 return;
590 }
478 if (page[getpagesize()] != 0)
479 atf_tc_fail("invalid data at %d: %x != 0",
480 getpagesize(), (int)page[getpagesize()]);
591
592 close(fd);
593}
594
595/* Signal handler which does nothing. */
596static void
597ignoreit(int sig __unused)
598{

--- 141 unchanged lines hidden ---
481
482 close(fd);
483}
484
485/* Signal handler which does nothing. */
486static void
487ignoreit(int sig __unused)
488{

--- 141 unchanged lines hidden ---