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 --- |