diff options
Diffstat (limited to 'src/sljit/sljitExecAllocator.c')
-rw-r--r-- | src/sljit/sljitExecAllocator.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/sljit/sljitExecAllocator.c b/src/sljit/sljitExecAllocator.c index 2e1c138..6e5bf78 100644 --- a/src/sljit/sljitExecAllocator.c +++ b/src/sljit/sljitExecAllocator.c @@ -166,23 +166,28 @@ static SLJIT_INLINE void apple_update_wx_flags(sljit_s32 enable_exec) static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { void *retval; - const int prot = PROT_READ | PROT_WRITE | PROT_EXEC; + int prot = PROT_READ | PROT_WRITE | PROT_EXEC; + int flags = MAP_PRIVATE; + int fd = -1; -#ifdef MAP_ANON - int flags = MAP_PRIVATE | MAP_ANON | SLJIT_MAP_JIT; +#ifdef PROT_MAX + prot |= PROT_MAX(prot); +#endif - retval = mmap(NULL, size, prot, flags, -1, 0); +#ifdef MAP_ANON + flags |= MAP_ANON | SLJIT_MAP_JIT; #else /* !MAP_ANON */ if (SLJIT_UNLIKELY((dev_zero < 0) && open_dev_zero())) return NULL; - retval = mmap(NULL, size, prot, MAP_PRIVATE, dev_zero, 0); + fd = dev_zero; #endif /* MAP_ANON */ + retval = mmap(NULL, size, prot, flags, fd, 0); if (retval == MAP_FAILED) return NULL; - if (mprotect(retval, size, prot) < 0) { + if (mprotect(retval, size, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) { munmap(retval, size); return NULL; } |