.. | .. |
---|
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); |
---|