Fix multiple MonoDebugMethodJitInfo memory leaks. (#52386)
authorJohan Lorensson <lateralusx.github@gmail.com>
Fri, 7 May 2021 07:26:05 +0000 (09:26 +0200)
committerGitHub <noreply@github.com>
Fri, 7 May 2021 07:26:05 +0000 (09:26 +0200)
src/mono/mono/metadata/mono-debug.c
src/mono/mono/mini/aot-compiler.c
src/mono/mono/mini/debug-mini.c
src/mono/mono/mini/mini-profiler.c

index 34529c2..bdef02c 100644 (file)
@@ -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;
 }
 
index b71bf25..4cc99ae 100644 (file)
@@ -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
 }
index 05ba5e9..2fdb64d 100644 (file)
@@ -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;
index 3de2a8d..cc20f01 100644 (file)
@@ -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