hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/testing/selftests/memfd/memfd_test.c
....@@ -290,6 +290,40 @@
290290 munmap(p, mfd_def_size);
291291 }
292292
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
+
293327 static void mfd_assert_write(int fd)
294328 {
295329 ssize_t l;
....@@ -421,6 +455,7 @@
421455 printf("mmap()+mprotect() didn't fail as expected\n");
422456 abort();
423457 }
458
+ munmap(p, mfd_def_size);
424459 }
425460
426461 /* verify PUNCH_HOLE fails */
....@@ -760,6 +795,8 @@
760795 mfd_assert_read_shared(fd2);
761796 mfd_fail_write(fd2);
762797
798
+ mfd_assert_fork_private_write(fd);
799
+
763800 munmap(p, mfd_def_size);
764801 close(fd2);
765802 close(fd);