Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/lib/libc/sys PR/55177: Carlo Arenas: mremap(MAP_REMAPD...



details:   https://anonhg.NetBSD.org/src/rev/45735e4c14d8
branches:  trunk
changeset: 971223:45735e4c14d8
user:      christos <christos%NetBSD.org@localhost>
date:      Sat Apr 18 17:44:53 2020 +0000

description:
PR/55177: Carlo Arenas: mremap(MAP_REMAPDUP) fails after fork()

diffstat:

 tests/lib/libc/sys/Makefile            |   4 +-
 tests/lib/libc/sys/t_mprotect.c        |  66 +++++++++++++++++++++++++++++++--
 tests/lib/libc/sys/t_mprotect_helper.c |  17 ++++++++
 3 files changed, 80 insertions(+), 7 deletions(-)

diffs (149 lines):

diff -r 8d613e347964 -r 45735e4c14d8 tests/lib/libc/sys/Makefile
--- a/tests/lib/libc/sys/Makefile       Sat Apr 18 17:31:52 2020 +0000
+++ b/tests/lib/libc/sys/Makefile       Sat Apr 18 17:44:53 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.61 2020/03/06 18:32:35 kamil Exp $
+# $NetBSD: Makefile,v 1.62 2020/04/18 17:44:53 christos Exp $
 
 MKMAN= no
 
@@ -85,7 +85,7 @@
 TESTS_C+=              t_wait_noproc_wnohang
 TESTS_C+=              t_write
 
-SRCS.t_mprotect=       t_mprotect.c ${SRCS_EXEC_PROT}
+SRCS.t_mprotect=       t_mprotect.c ${SRCS_EXEC_PROT} t_mprotect_helper.c
 
 LDADD.t_getpid+=        -lpthread
 
diff -r 8d613e347964 -r 45735e4c14d8 tests/lib/libc/sys/t_mprotect.c
--- a/tests/lib/libc/sys/t_mprotect.c   Sat Apr 18 17:31:52 2020 +0000
+++ b/tests/lib/libc/sys/t_mprotect.c   Sat Apr 18 17:44:53 2020 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: t_mprotect.c,v 1.8 2019/07/16 17:29:18 martin Exp $ */
+/* $NetBSD: t_mprotect.c,v 1.9 2020/04/18 17:44:53 christos Exp $ */
 
 /*-
- * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2011, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_mprotect.c,v 1.8 2019/07/16 17:29:18 martin Exp $");
+__RCSID("$NetBSD: t_mprotect.c,v 1.9 2020/04/18 17:44:53 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/mman.h>
@@ -45,6 +45,7 @@
 #include <atf-c.h>
 
 #include "../common/exec_prot.h"
+#include "t_mprotect_helper.h"
 
 static long    page = 0;
 static char    path[] = "mmap";
@@ -243,8 +244,8 @@
         *   (3) making a non-executable mapping executable
         *
         *   (4) making an executable/read-only file mapping
-        *       writable except for performing relocations
-        *       on an ET_DYN ELF file (non-PIC shared library)
+        *       writable except for performing relocations
+        *       on an ET_DYN ELF file (non-PIC shared library)
         *
         *  The following will test only the case (3).
         *
@@ -383,6 +384,60 @@
        ATF_REQUIRE(munmap(map2, page) == 0);
 }
 
+ATF_TC(mprotect_mremap_fork_exec);
+ATF_TC_HEAD(mprotect_mremap_fork_exec, tc)
+{
+       atf_tc_set_md_var(tc, "descr",
+          "Test mremap(2)+fork(2)+mprotect(2) executable space protections");
+}
+
+ATF_TC_BODY(mprotect_mremap_fork_exec, tc)
+{
+       void *map, *map2;
+       pid_t pid;
+
+       atf_tc_expect_fail("PR lib/55177");
+
+       /*
+        * Map a page read/write/exec and duplicate it.
+        * Map the copy executable.
+        * Copy a function to the writeable mapping and execute it
+        * Fork a child and wait for it
+        * Copy a different function to the writeable mapping and execute it
+        * The original function shouldn't be called
+        */
+
+       map = mmap(NULL, page, PROT_READ|PROT_WRITE|PROT_MPROTECT(PROT_EXEC),
+           MAP_ANON, -1, 0);
+       ATF_REQUIRE(map != MAP_FAILED);
+       map2 = mremap(map, page, NULL, page, MAP_REMAPDUP);
+       ATF_REQUIRE(map2 != MAP_FAILED);
+       ATF_REQUIRE(mprotect(map2, page, PROT_EXEC|PROT_READ) == 0);
+
+       memcpy(map, (void *)return_1,
+           (uintptr_t)return_2 - (uintptr_t)return_1);
+       __builtin___clear_cache(map, (void *)((uintptr_t)map + page));
+
+       ATF_REQUIRE(((int (*)(void))map2)() == 1);
+
+       pid = fork();
+       ATF_REQUIRE(pid >= 0);
+
+       if (pid == 0)
+               _exit(0);
+
+       (void)wait(NULL);
+
+       memcpy(map, (void *)return_2,
+           (uintptr_t)return_3 - (uintptr_t)return_2);
+       __builtin___clear_cache(map, (void *)((uintptr_t)map + page));
+
+       ATF_REQUIRE(((int (*)(void))map2)() == 2);
+
+       ATF_REQUIRE(munmap(map, page) == 0);
+       ATF_REQUIRE(munmap(map2, page) == 0);
+}
+
 ATF_TP_ADD_TCS(tp)
 {
        page = sysconf(_SC_PAGESIZE);
@@ -394,6 +449,7 @@
        ATF_TP_ADD_TC(tp, mprotect_pax);
        ATF_TP_ADD_TC(tp, mprotect_write);
        ATF_TP_ADD_TC(tp, mprotect_mremap_exec);
+       ATF_TP_ADD_TC(tp, mprotect_mremap_fork_exec);
 
        return atf_no_error();
 }
diff -r 8d613e347964 -r 45735e4c14d8 tests/lib/libc/sys/t_mprotect_helper.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lib/libc/sys/t_mprotect_helper.c    Sat Apr 18 17:44:53 2020 +0000
@@ -0,0 +1,17 @@
+#include "t_mprotect_helper.h"
+
+int
+return_1(void)
+{
+       return 1;
+}
+int
+return_2(void)
+{
+       return 2;
+}
+int
+return_3(void)
+{
+       return 3;
+}



Home | Main Index | Thread Index | Old Index