| .. | .. |
|---|
| 290 | 290 | munmap(p, mfd_def_size); |
|---|
| 291 | 291 | } |
|---|
| 292 | 292 | |
|---|
| 293 | +static void mfd_assert_fork_private_write(int fd) |
|---|
| 294 | +{ |
|---|
| 295 | + int *p; |
|---|
| 296 | + pid_t pid; |
|---|
| 297 | + |
|---|
| 298 | + p = mmap(NULL, |
|---|
| 299 | + mfd_def_size, |
|---|
| 300 | + PROT_READ | PROT_WRITE, |
|---|
| 301 | + MAP_PRIVATE, |
|---|
| 302 | + fd, |
|---|
| 303 | + 0); |
|---|
| 304 | + if (p == MAP_FAILED) { |
|---|
| 305 | + printf("mmap() failed: %m\n"); |
|---|
| 306 | + abort(); |
|---|
| 307 | + } |
|---|
| 308 | + |
|---|
| 309 | + p[0] = 22; |
|---|
| 310 | + |
|---|
| 311 | + pid = fork(); |
|---|
| 312 | + if (pid == 0) { |
|---|
| 313 | + p[0] = 33; |
|---|
| 314 | + exit(0); |
|---|
| 315 | + } else { |
|---|
| 316 | + waitpid(pid, NULL, 0); |
|---|
| 317 | + |
|---|
| 318 | + if (p[0] != 22) { |
|---|
| 319 | + printf("MAP_PRIVATE copy-on-write failed: %m\n"); |
|---|
| 320 | + abort(); |
|---|
| 321 | + } |
|---|
| 322 | + } |
|---|
| 323 | + |
|---|
| 324 | + munmap(p, mfd_def_size); |
|---|
| 325 | +} |
|---|
| 326 | + |
|---|
| 293 | 327 | static void mfd_assert_write(int fd) |
|---|
| 294 | 328 | { |
|---|
| 295 | 329 | ssize_t l; |
|---|
| .. | .. |
|---|
| 421 | 455 | printf("mmap()+mprotect() didn't fail as expected\n"); |
|---|
| 422 | 456 | abort(); |
|---|
| 423 | 457 | } |
|---|
| 458 | + munmap(p, mfd_def_size); |
|---|
| 424 | 459 | } |
|---|
| 425 | 460 | |
|---|
| 426 | 461 | /* verify PUNCH_HOLE fails */ |
|---|
| .. | .. |
|---|
| 760 | 795 | mfd_assert_read_shared(fd2); |
|---|
| 761 | 796 | mfd_fail_write(fd2); |
|---|
| 762 | 797 | |
|---|
| 798 | + mfd_assert_fork_private_write(fd); |
|---|
| 799 | + |
|---|
| 763 | 800 | munmap(p, mfd_def_size); |
|---|
| 764 | 801 | close(fd2); |
|---|
| 765 | 802 | close(fd); |
|---|