aboutsummaryrefslogtreecommitdiff
path: root/src/lj_ccallback.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_ccallback.c')
-rw-r--r--src/lj_ccallback.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index 52f92932..d93dbc64 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -262,6 +262,14 @@ static void *callback_mcode_init(global_State *g, uint32_t *page)
262#define CCPROT_CREATE 0 262#define CCPROT_CREATE 0
263#endif 263#endif
264 264
265/* Check for macOS hardened runtime. */
266#if LUAJIT_SECURITY_MCODE != 0 && defined(MAP_JIT) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000
267#include <pthread.h>
268#define CCMAP_CREATE MAP_JIT
269#else
270#define CCMAP_CREATE 0
271#endif
272
265#endif 273#endif
266 274
267/* Allocate and initialize area for callback function pointers. */ 275/* Allocate and initialize area for callback function pointers. */
@@ -276,10 +284,13 @@ static void callback_mcode_new(CTState *cts)
276 if (!p) 284 if (!p)
277 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); 285 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
278#elif LJ_TARGET_POSIX 286#elif LJ_TARGET_POSIX
279 p = mmap(NULL, sz, (PROT_READ|PROT_WRITE|CCPROT_CREATE), MAP_PRIVATE|MAP_ANONYMOUS, 287 p = mmap(NULL, sz, PROT_READ|PROT_WRITE|CCPROT_CREATE,
280 -1, 0); 288 MAP_PRIVATE|MAP_ANONYMOUS|CCMAP_CREATE, -1, 0);
281 if (p == MAP_FAILED) 289 if (p == MAP_FAILED)
282 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); 290 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
291#if CCMAP_CREATE
292 pthread_jit_write_protect_np(0);
293#endif
283#else 294#else
284 /* Fallback allocator. Fails if memory is not executable by default. */ 295 /* Fallback allocator. Fails if memory is not executable by default. */
285 p = lj_mem_new(cts->L, sz); 296 p = lj_mem_new(cts->L, sz);
@@ -296,8 +307,12 @@ static void callback_mcode_new(CTState *cts)
296 LJ_WIN_VPROTECT(p, sz, PAGE_EXECUTE_READ, &oprot); 307 LJ_WIN_VPROTECT(p, sz, PAGE_EXECUTE_READ, &oprot);
297 } 308 }
298#elif LJ_TARGET_POSIX 309#elif LJ_TARGET_POSIX
310#if CCMAP_CREATE
311 pthread_jit_write_protect_np(1);
312#else
299 mprotect(p, sz, (PROT_READ|PROT_EXEC)); 313 mprotect(p, sz, (PROT_READ|PROT_EXEC));
300#endif 314#endif
315#endif
301} 316}
302 317
303/* Free area for callback function pointers. */ 318/* Free area for callback function pointers. */