summaryrefslogtreecommitdiff
path: root/os_dep.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2018-12-21 02:33:49 +0300
committerIvan Maidanski <ivmai@mail.ru>2018-12-21 02:33:49 +0300
commit1c62b365b088c409c7ee3546783194c8fdbef31b (patch)
treebef7797a3ad9ede351daf1b56cef8e6a58442dbd /os_dep.c
parentf70a2fe9058f655bb75759f7b9ec534fa27ca949 (diff)
downloadbdwgc-1c62b365b088c409c7ee3546783194c8fdbef31b.tar.gz
Abort with appropriate message if executable pages cannot be allocated
This may happen e.g. if PaX MPROTECT feature is enabled. * os_dep.c [!OS2 && !PCR && !AMIGA && !USE_WINALLOC && !MACOS && !DOS4GW && !NONSTOP && !SN_TARGET_PSP2 && !RTEMS && !__CC_ARM && MMAP_SUPPORTED] (GC_unix_mmap_get_mem): Treat result==MAP_FAILED as unlikely; if the first mmap call returns MAP_FAILED then ABORT with the appropriate message if GC_pages_executable (and errno is EACCES).
Diffstat (limited to 'os_dep.c')
-rw-r--r--os_dep.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/os_dep.c b/os_dep.c
index 52391bde..1f6a0b5d 100644
--- a/os_dep.c
+++ b/os_dep.c
@@ -2184,7 +2184,11 @@ void GC_register_data_segments(void)
GC_MMAP_FLAGS | OPT_MAP_ANON, zero_fd, 0/* offset */);
# undef IGNORE_PAGES_EXECUTABLE
- if (result == MAP_FAILED) return(0);
+ if (EXPECT(MAP_FAILED == result, FALSE)) {
+ if (HEAP_START == last_addr && GC_pages_executable && EACCES == errno)
+ ABORT("Cannot allocate executable pages");
+ return NULL;
+ }
last_addr = (ptr_t)(((word)result + bytes + GC_page_size - 1)
& ~(GC_page_size - 1));
# if !defined(LINUX)