From a53f0a0e3711f708809d705672104e3ca3e2064c Mon Sep 17 00:00:00 2001 From: lateralusX Date: Thu, 6 May 2021 15:50:48 +0200 Subject: [PATCH] Fix multiple MonoDebugMethodJitInfo memory leaks. --- src/mono/mono/metadata/mono-debug.c | 5 +++-- src/mono/mono/mini/aot-compiler.c | 8 ++++++-- src/mono/mono/mini/debug-mini.c | 2 ++ src/mono/mono/mini/mini-profiler.c | 6 +++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/mono/mono/metadata/mono-debug.c b/src/mono/mono/metadata/mono-debug.c index 34529c280f553..bdef02c84f020 100644 --- a/src/mono/mono/metadata/mono-debug.c +++ b/src/mono/mono/metadata/mono-debug.c @@ -692,14 +692,15 @@ find_method (MonoMethod *method, MonoDebugMethodJitInfo *jit) MonoDebugMethodJitInfo * mono_debug_find_method (MonoMethod *method, MonoDomain *domain) { - MonoDebugMethodJitInfo *res = g_new0 (MonoDebugMethodJitInfo, 1); - if (mono_debug_format == MONO_DEBUG_FORMAT_NONE) return NULL; + MonoDebugMethodJitInfo *res = g_new0 (MonoDebugMethodJitInfo, 1); + mono_debugger_lock (); find_method (method, res); mono_debugger_unlock (); + return res; } diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index b71bf259ce320..4cc99aee5beaa 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -6641,7 +6641,9 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) acfg->cfgs [method_index]->got_offset = acfg->got_offset; - emit_and_reloc_code (acfg, method, code, cfg->code_len, cfg->patch_info, FALSE, mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ())); + MonoDebugMethodJitInfo *jit_debug_info = mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ()); + emit_and_reloc_code (acfg, method, code, cfg->code_len, cfg->patch_info, FALSE, jit_debug_info); + mono_debug_free_method_jit_info (jit_debug_info); emit_line (acfg); @@ -11734,7 +11736,9 @@ emit_dwarf_info (MonoAotCompile *acfg) sprintf (symbol2, "%sme_%x", acfg->temp_prefix, i); - mono_dwarf_writer_emit_method (acfg->dwarf, cfg, cfg->method, cfg->asm_symbol, symbol2, cfg->asm_debug_symbol, (guint8 *)cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ())); + MonoDebugMethodJitInfo *jit_debug_info = mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ()); + mono_dwarf_writer_emit_method (acfg->dwarf, cfg, cfg->method, cfg->asm_symbol, symbol2, cfg->asm_debug_symbol, (guint8 *)cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, jit_debug_info); + mono_debug_free_method_jit_info (jit_debug_info); } #endif } diff --git a/src/mono/mono/mini/debug-mini.c b/src/mono/mono/mini/debug-mini.c index 05ba5e9cb527b..2fdb64d2c12b2 100644 --- a/src/mono/mono/mini/debug-mini.c +++ b/src/mono/mono/mini/debug-mini.c @@ -498,6 +498,8 @@ mono_debug_serialize_debug_info (MonoCompile *cfg, guint8 **out_buf, guint32 *bu prev_native_offset = lne->native_offset; } + mono_debug_free_method_jit_info (jit); + g_assert (p - buf < size); *out_buf = buf; diff --git a/src/mono/mono/mini/mini-profiler.c b/src/mono/mono/mini/mini-profiler.c index 3de2a8d18e833..cc20f01d4a2ad 100644 --- a/src/mono/mono/mini/mini-profiler.c +++ b/src/mono/mono/mini/mini-profiler.c @@ -356,7 +356,11 @@ mini_profiler_context_get_local (MonoProfilerCallContext *ctx, guint32 pos) if (!info) return NULL; - return get_variable_buffer (info, &info->locals [pos], &ctx->context); + gpointer variable_buffer = get_variable_buffer (info, &info->locals [pos], &ctx->context); + + mono_debug_free_method_jit_info (info); + + return variable_buffer; } gpointer