[jit] Fix memory leak in trampoline info registration. (#4775)
authorvkargov <kargov@gmail.com>
Wed, 3 May 2017 20:28:58 +0000 (13:28 -0700)
committerLudovic Henry <ludovic@xamarin.com>
Wed, 3 May 2017 20:28:58 +0000 (16:28 -0400)
mono/mini/mini-runtime.c

index 5085233d27ab9376bac85309f92de891999adf9a..55275e0cade3f739c4a800bc1bda10f6e571f48a 100644 (file)
@@ -484,7 +484,11 @@ mono_tramp_info_register_internal (MonoTrampInfo *info, MonoDomain *domain, gboo
        if (!domain)
                domain = mono_get_root_domain ();
 
-       copy = g_new0 (MonoTrampInfo, 1);
+       if (domain)
+               copy = mono_domain_alloc0 (domain, sizeof (MonoTrampInfo));
+       else
+               copy = g_new0 (MonoTrampInfo, 1);
+
        copy->code = info->code;
        copy->code_size = info->code_size;
        copy->name = g_strdup (info->name);
@@ -498,10 +502,6 @@ mono_tramp_info_register_internal (MonoTrampInfo *info, MonoDomain *domain, gboo
                copy->uw_info_len = info->uw_info_len;
        }
 
-       mono_jit_lock ();
-       tramp_infos = g_slist_prepend (tramp_infos, copy);
-       mono_jit_unlock ();
-
        mono_save_trampoline_xdebug_info (info);
        mono_lldb_save_trampoline_info (info);
 
@@ -510,9 +510,15 @@ mono_tramp_info_register_internal (MonoTrampInfo *info, MonoDomain *domain, gboo
                mono_arch_unwindinfo_install_tramp_unwind_info (info->unwind_ops, info->code, info->code_size);
 #endif
 
-       /* Only register trampolines that have unwind infos */
-       if (mono_get_root_domain () && copy->uw_info)
+       if (!domain) {
+               /* If no root domain has been created yet, postpone the registration. */
+               mono_jit_lock ();
+               tramp_infos = g_slist_prepend (tramp_infos, copy);
+               mono_jit_unlock ();
+       } else if (copy->uw_info) {
+               /* Only register trampolines that have unwind infos */
                register_trampoline_jit_info (domain, copy);
+       }
 
        if (mono_jit_map_is_enabled ())
                mono_emit_jit_tramp (info->code, info->code_size, info->name);