From 3217240b4767d481f7dd5e7036721aec643a1f11 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 29 Mar 2021 10:41:52 +0200 Subject: NetBSD: Use PROT_MPROTECT() and disable getentropy(). Note: this is not an officially supported target. Contributed by David Carlier. --- src/lj_ccallback.c | 7 ++++++- src/lj_mcode.c | 9 +++++++-- src/lj_prng.c | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c index 9de86258..8d6cb737 100644 --- a/src/lj_ccallback.c +++ b/src/lj_ccallback.c @@ -256,6 +256,11 @@ static void *callback_mcode_init(global_State *g, uint32_t *page) #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif +#ifdef PROT_MPROTECT +#define CCPROT_CREATE (PROT_MPROTECT(PROT_EXEC)) +#else +#define CCPROT_CREATE 0 +#endif #endif @@ -271,7 +276,7 @@ static void callback_mcode_new(CTState *cts) if (!p) lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); #elif LJ_TARGET_POSIX - p = mmap(NULL, sz, (PROT_READ|PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS, + p = mmap(NULL, sz, (PROT_READ|PROT_WRITE|CCPROT_CREATE), MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); diff --git a/src/lj_mcode.c b/src/lj_mcode.c index b34d7c85..b3efbc55 100644 --- a/src/lj_mcode.c +++ b/src/lj_mcode.c @@ -97,10 +97,15 @@ static int mcode_setprot(void *p, size_t sz, DWORD prot) #define MCPROT_RW (PROT_READ|PROT_WRITE) #define MCPROT_RX (PROT_READ|PROT_EXEC) #define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC) +#ifdef PROT_MPROTECT +#define MCPROT_CREATE (PROT_MPROTECT(MCPROT_RWX)) +#else +#define MCPROT_CREATE 0 +#endif static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot) { - void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + void *p = mmap((void *)hint, sz, prot|MCPROT_CREATE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) { if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL); p = NULL; @@ -238,7 +243,7 @@ static void *mcode_alloc(jit_State *J, size_t sz) /* All memory addresses are reachable by relative jumps. */ static void *mcode_alloc(jit_State *J, size_t sz) { -#if defined(__OpenBSD__) || LJ_TARGET_UWP +#if defined(__OpenBSD__) || defined(__NetBSD__) || LJ_TARGET_UWP /* Allow better executable memory allocation for OpenBSD W^X mode. */ void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN); if (p && mcode_setprot(p, sz, MCPROT_GEN)) { diff --git a/src/lj_prng.c b/src/lj_prng.c index 0c4a5cf0..a390662d 100644 --- a/src/lj_prng.c +++ b/src/lj_prng.c @@ -121,7 +121,7 @@ static PRGR libfunc_rgr; #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200 #define LJ_TARGET_HAS_GETENTROPY 1 #endif -#elif LJ_TARGET_BSD || LJ_TARGET_SOLARIS || LJ_TARGET_CYGWIN +#elif (LJ_TARGET_BSD && !defined(__NetBSD__)) || LJ_TARGET_SOLARIS || LJ_TARGET_CYGWIN #define LJ_TARGET_HAS_GETENTROPY 1 #endif -- cgit v1.2.3-55-g6feb