diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2018-12-21 02:33:49 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2018-12-21 02:33:49 +0300 |
commit | 1c62b365b088c409c7ee3546783194c8fdbef31b (patch) | |
tree | bef7797a3ad9ede351daf1b56cef8e6a58442dbd /os_dep.c | |
parent | f70a2fe9058f655bb75759f7b9ec534fa27ca949 (diff) | |
download | bdwgc-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.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -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) |