diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_ccallback.c | 19 |
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. */ |