From 4cf547f27b17ec0f4025e9c0b41b7f3d82137ef7 Mon Sep 17 00:00:00 2001 From: zherczeg Date: Tue, 19 Nov 2019 12:54:59 +0000 Subject: JIT compiler update. git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1757 2f5784b3-3f2a-0410-8824-cb99058d5e15 --- sljit/sljitConfigInternal.h | 4 ++++ sljit/sljitExecAllocator.c | 28 ++++++++++++++++++++++++---- sljit/sljitNativeX86_64.c | 2 +- sljit/sljitNativeX86_common.c | 1 + sljit/sljitUtils.c | 6 ++++++ 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/sljit/sljitConfigInternal.h b/sljit/sljitConfigInternal.h index ba60311..acba9da 100644 --- a/sljit/sljitConfigInternal.h +++ b/sljit/sljitConfigInternal.h @@ -214,6 +214,10 @@ #define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len) #endif +#ifndef SLJIT_MEMMOVE +#define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len) +#endif + #ifndef SLJIT_ZEROMEM #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len) #endif diff --git a/sljit/sljitExecAllocator.c b/sljit/sljitExecAllocator.c index 3b37a97..92ddb94 100644 --- a/sljit/sljitExecAllocator.c +++ b/sljit/sljitExecAllocator.c @@ -118,10 +118,20 @@ static SLJIT_INLINE int get_map_jit_flag() if (map_jit_flag == -1) { struct utsname name; + map_jit_flag = 0; uname(&name); /* Kernel version for 10.14.0 (Mojave) */ - map_jit_flag = (atoi(name.release) >= 18) ? MAP_JIT : 0; + if (atoi(name.release) >= 18) { + /* Only use MAP_JIT if a hardened runtime is used, because MAP_JIT is incompatible with fork(). */ + void *ptr = mmap(NULL, getpagesize(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + + if (ptr == MAP_FAILED) { + map_jit_flag = MAP_JIT; + } else { + munmap(ptr, getpagesize()); + } + } } return map_jit_flag; @@ -137,6 +147,7 @@ static SLJIT_INLINE int get_map_jit_flag() static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { void *retval; + const int prot = PROT_READ | PROT_WRITE | PROT_EXEC; #ifdef MAP_ANON @@ -146,16 +157,25 @@ static SLJIT_INLINE void* alloc_chunk(sljit_uw size) flags |= get_map_jit_flag(); #endif - retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, flags, -1, 0); + retval = mmap(NULL, size, prot, flags, -1, 0); #else /* !MAP_ANON */ if (dev_zero < 0) { if (open_dev_zero()) return NULL; } - retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero, 0); + retval = mmap(NULL, size, prot, MAP_PRIVATE, dev_zero, 0); #endif /* MAP_ANON */ - return (retval != MAP_FAILED) ? retval : NULL; + if (retval == MAP_FAILED) + retval = NULL; + else { + if (mprotect(retval, size, prot) < 0) { + munmap(retval, size); + retval = NULL; + } + } + + return retval; } static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) diff --git a/sljit/sljitNativeX86_64.c b/sljit/sljitNativeX86_64.c index 8ebbd1c..5758711 100644 --- a/sljit/sljitNativeX86_64.c +++ b/sljit/sljitNativeX86_64.c @@ -103,7 +103,7 @@ static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, slji } code_ptr -= put_label->flags + (2 + sizeof(sljit_uw)); - SLJIT_MEMCPY(code_ptr, code_ptr + (2 + sizeof(sljit_uw)), put_label->flags); + SLJIT_MEMMOVE(code_ptr, code_ptr + (2 + sizeof(sljit_uw)), put_label->flags); SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); diff --git a/sljit/sljitNativeX86_common.c b/sljit/sljitNativeX86_common.c index 26e8475..6296da5 100644 --- a/sljit/sljitNativeX86_common.c +++ b/sljit/sljitNativeX86_common.c @@ -2515,6 +2515,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); PTR_FAIL_IF_NULL(jump); set_jump(jump, compiler, (type & SLJIT_REWRITABLE_JUMP) | ((type & 0xff) << TYPE_SHIFT)); + type &= 0xff; /* Worst case size. */ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) diff --git a/sljit/sljitUtils.c b/sljit/sljitUtils.c index 5c2a838..857492a 100644 --- a/sljit/sljitUtils.c +++ b/sljit/sljitUtils.c @@ -154,7 +154,13 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void) #include "windows.h" #else /* Provides mmap function. */ +#include #include +#ifndef MAP_ANON +#ifdef MAP_ANONYMOUS +#define MAP_ANON MAP_ANONYMOUS +#endif +#endif /* For detecting the page size. */ #include -- cgit v1.2.1