From 1b5d4e00300a35ff0ba8b115c0f3a48049c1b4c0 Mon Sep 17 00:00:00 2001 From: Johan Lorensson Date: Fri, 7 May 2021 09:26:05 +0200 Subject: [PATCH] Fix multiple MonoDebugMethodJitInfo memory leaks. (#52386) --- 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 34529c280f5..bdef02c84f0 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 b71bf259ce3..4cc99aee5be 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 05ba5e9cb52..2fdb64d2c12 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 3de2a8d18e8..cc20f01d4a2 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 -- 2.34.1