Fix 'mprotect remapping failed' abort on NetBSD with PaX enabled
authorIvan Maidanski <ivmai@mail.ru>
Thu, 20 Dec 2018 21:54:55 +0000 (00:54 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 20 Dec 2018 21:54:55 +0000 (00:54 +0300)
Issue #255 (bdwgc).

Without this patch, GC_remap() works on NetBSD which has the PaX feature
only if PaX MPROTECT is off (sysctl -w security.pax.mprotect.enabled=0).

* os_dep.c [USE_MUNMAP && !USE_WINALLOC && NETBSD] (GC_remap): Call
mmap() instead of mprotect().

os_dep.c

index b2efe32..52391bd 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -2635,8 +2635,10 @@ GC_INNER void GC_remap(ptr_t start, size_t bytes)
 #   else
       /* It was already remapped with PROT_NONE. */
       {
-#       ifdef NACL
+#       if defined(NACL) || defined(NETBSD)
           /* NaCl does not expose mprotect, but mmap should work fine.  */
+          /* In case of NetBSD, mprotect fails (unlike mmap) even       */
+          /* without PROT_EXEC if PaX MPROTECT feature is enabled.      */
           void *result = mmap(start_addr, len, (PROT_READ | PROT_WRITE)
                                     | (GC_pages_executable ? PROT_EXEC : 0),
                                    MAP_PRIVATE | MAP_FIXED | OPT_MAP_ANON,