Skip to content

Commit 70524e6

Browse files
Switch to writable executable memory before allocating executable code, as allocation might memset it and segfault.
1 parent d07f8e5 commit 70524e6

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

mono/mini/mini-arm64.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5010,12 +5010,13 @@ mono_arch_build_imt_trampoline (MonoVTable *vtable, MonoDomain *domain, MonoIMTC
50105010
}
50115011
}
50125012

5013+
MONO_SCOPE_ENABLE_JIT_WRITE();
5014+
50135015
if (fail_tramp)
50145016
buf = mono_method_alloc_generic_virtual_trampoline (domain, buf_len);
50155017
else
50165018
buf = mono_domain_code_reserve (domain, buf_len);
50175019
code = buf;
5018-
MONO_SCOPE_ENABLE_JIT_WRITE();
50195020

50205021
/*
50215022
* We are called by JITted code, which passes in the IMT argument in

mono/mini/mini-runtime.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,18 @@ void *mono_global_codeman_reserve (int size)
351351
if (!global_codeman) {
352352
/* This can happen during startup */
353353
global_codeman = mono_code_manager_new ();
354+
355+
MONO_SCOPE_ENABLE_JIT_WRITE();
354356
return mono_code_manager_reserve (global_codeman, size);
355357
}
356358
else {
357359
mono_jit_lock ();
358-
ptr = mono_code_manager_reserve (global_codeman, size);
360+
361+
{
362+
MONO_SCOPE_ENABLE_JIT_WRITE();
363+
ptr = mono_code_manager_reserve (global_codeman, size);
364+
}
365+
359366
mono_jit_unlock ();
360367
return ptr;
361368
}
@@ -1407,6 +1414,7 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code,
14071414
gpointer *jump_table;
14081415
int i;
14091416
if (method && method->dynamic) {
1417+
MONO_SCOPE_ENABLE_JIT_WRITE();
14101418
jump_table = (void **)mono_code_manager_reserve (mono_dynamic_code_hash_lookup (domain, method)->code_mp, sizeof (gpointer) * patch_info->data.table->table_size);
14111419
} else {
14121420
if (mono_aot_only) {
@@ -3666,7 +3674,11 @@ static void
36663674
dynamic_method_info_free (gpointer key, gpointer value, gpointer user_data)
36673675
{
36683676
MonoJitDynamicMethodInfo *di = (MonoJitDynamicMethodInfo *)value;
3669-
mono_code_manager_destroy (di->code_mp);
3677+
3678+
{
3679+
MONO_SCOPE_ENABLE_JIT_WRITE();
3680+
mono_code_manager_destroy (di->code_mp);
3681+
}
36703682
g_free (di);
36713683
}
36723684

mono/mini/mini.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2175,8 +2175,10 @@ mono_postprocess_patches (MonoCompile *cfg)
21752175
case MONO_PATCH_INFO_SWITCH: {
21762176
gpointer *table;
21772177
if (cfg->method->dynamic) {
2178+
MONO_SCOPE_ENABLE_JIT_WRITE();
21782179
table = (void **)mono_code_manager_reserve (cfg->dynamic_info->code_mp, sizeof (gpointer) * patch_info->data.table->table_size);
21792180
} else {
2181+
MONO_SCOPE_ENABLE_JIT_WRITE();
21802182
table = (void **)mono_domain_code_reserve (cfg->domain, sizeof (gpointer) * patch_info->data.table->table_size);
21812183
}
21822184

@@ -2301,17 +2303,24 @@ mono_codegen (MonoCompile *cfg)
23012303
if (cfg->method->dynamic) {
23022304
/* Allocate the code into a separate memory pool so it can be freed */
23032305
cfg->dynamic_info = g_new0 (MonoJitDynamicMethodInfo, 1);
2304-
cfg->dynamic_info->code_mp = mono_code_manager_new_dynamic ();
2306+
2307+
{
2308+
MONO_SCOPE_ENABLE_JIT_WRITE();
2309+
cfg->dynamic_info->code_mp = mono_code_manager_new_dynamic ();
2310+
}
2311+
23052312
mono_domain_lock (cfg->domain);
23062313
mono_dynamic_code_hash_insert (cfg->domain, cfg->method, cfg->dynamic_info);
23072314
mono_domain_unlock (cfg->domain);
23082315

2316+
MONO_SCOPE_ENABLE_JIT_WRITE();
23092317
if (mono_using_xdebug)
23102318
/* See the comment for cfg->code_domain */
23112319
code = (guint8 *)mono_domain_code_reserve (code_domain, cfg->code_size + cfg->thunk_area + unwindlen);
23122320
else
23132321
code = (guint8 *)mono_code_manager_reserve (cfg->dynamic_info->code_mp, cfg->code_size + cfg->thunk_area + unwindlen);
23142322
} else {
2323+
MONO_SCOPE_ENABLE_JIT_WRITE();
23152324
code = (guint8 *)mono_domain_code_reserve (code_domain, cfg->code_size + cfg->thunk_area + unwindlen);
23162325
}
23172326

@@ -2399,11 +2408,13 @@ mono_codegen (MonoCompile *cfg)
23992408
#endif
24002409

24012410
if (cfg->method->dynamic) {
2411+
MONO_SCOPE_ENABLE_JIT_WRITE();
24022412
if (mono_using_xdebug)
24032413
mono_domain_code_commit (code_domain, cfg->native_code, cfg->code_size, cfg->code_len);
24042414
else
24052415
mono_code_manager_commit (cfg->dynamic_info->code_mp, cfg->native_code, cfg->code_size, cfg->code_len);
24062416
} else {
2417+
MONO_SCOPE_ENABLE_JIT_WRITE();
24072418
mono_domain_code_commit (code_domain, cfg->native_code, cfg->code_size, cfg->code_len);
24082419
}
24092420
MONO_PROFILER_RAISE (jit_code_buffer, (cfg->native_code, cfg->code_len, MONO_PROFILER_CODE_BUFFER_METHOD, cfg->method));

mono/mini/tramp-arm64.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,8 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
355355
guint32 size = 32;
356356
MonoDomain *domain = mono_domain_get ();
357357

358-
start = code = mono_domain_code_reserve (domain, size);
359358
MONO_SCOPE_ENABLE_JIT_WRITE();
359+
start = code = mono_domain_code_reserve (domain, size);
360360

361361
code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)addr);
362362
arm_addx_imm (code, ARMREG_R0, ARMREG_R0, sizeof (MonoObject));
@@ -374,8 +374,8 @@ mono_arch_get_static_rgctx_trampoline (gpointer arg, gpointer addr)
374374
guint32 buf_len = 32;
375375
MonoDomain *domain = mono_domain_get ();
376376

377-
start = code = mono_domain_code_reserve (domain, buf_len);
378377
MONO_SCOPE_ENABLE_JIT_WRITE();
378+
start = code = mono_domain_code_reserve (domain, buf_len);
379379

380380
code = mono_arm_emit_imm64 (code, MONO_ARCH_RGCTX_REG, (guint64)arg);
381381
code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)addr);

0 commit comments

Comments
 (0)