diff options
author | Fan Yang <52458914+fanyang-mono@users.noreply.github.com> | 2021-06-17 16:21:46 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-17 16:21:46 +0300 |
commit | 284cb67f65098660f5764c8044f42c098cbe8934 (patch) | |
tree | c1b00a93cad417e8e43d29f7c459e9ee60618810 /mono | |
parent | 165d8666e19a89304eb0c993063b876899f36f82 (diff) |
Fix memory leak during data registration (#21107)
Diffstat (limited to 'mono')
-rw-r--r-- | mono/mini/mini-generic-sharing.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/mono/mini/mini-generic-sharing.c b/mono/mini/mini-generic-sharing.c index 37507f22422..9b66044e58b 100644 --- a/mono/mini/mini-generic-sharing.c +++ b/mono/mini/mini-generic-sharing.c @@ -2783,6 +2783,7 @@ mini_rgctx_info_type_to_patch_info_type (MonoRgctxInfoType info_type) * @method: a method * @in_mrgctx: whether to put the data into the MRGCTX * @data: the info data + * @did_register: whether data was registered * @info_type: the type of info to register about data * @generic_context: a generic context * @@ -2791,7 +2792,7 @@ mini_rgctx_info_type_to_patch_info_type (MonoRgctxInfoType info_type) * encoded slot number. */ static guint32 -lookup_or_register_info (MonoClass *klass, MonoMethod *method, gboolean in_mrgctx, gpointer data, +lookup_or_register_info (MonoClass *klass, MonoMethod *method, gboolean in_mrgctx, gpointer data, gboolean *did_register, MonoRgctxInfoType info_type, MonoGenericContext *generic_context) { int type_argc = 0; @@ -2840,7 +2841,10 @@ lookup_or_register_info (MonoClass *klass, MonoMethod *method, gboolean in_mrgct /* We haven't found the info */ if (index == -1) + { index = register_info (klass, type_argc, data, info_type); + *did_register = TRUE; + } /* interlocked by loader lock */ if (index > UnlockedRead (&rgctx_max_slot_number)) @@ -4233,6 +4237,8 @@ int mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry) { gpointer entry_data = NULL; + gboolean did_register = FALSE; + guint32 result = -1; switch (entry->data->type) { case MONO_PATCH_INFO_CLASS: @@ -4299,9 +4305,27 @@ mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry) } if (entry->in_mrgctx) - return lookup_or_register_info (entry->d.method->klass, entry->d.method, entry->in_mrgctx, entry_data, entry->info_type, mono_method_get_context (entry->d.method)); + result = lookup_or_register_info (entry->d.method->klass, entry->d.method, entry->in_mrgctx, entry_data, &did_register, entry->info_type, mono_method_get_context (entry->d.method)); else - return lookup_or_register_info (entry->d.klass, NULL, entry->in_mrgctx, entry_data, entry->info_type, mono_class_get_context (entry->d.klass)); + result = lookup_or_register_info (entry->d.klass, NULL, entry->in_mrgctx, entry_data, &did_register, entry->info_type, mono_class_get_context (entry->d.klass)); + + if (!did_register) + switch (entry->data->type) { + case MONO_PATCH_INFO_GSHAREDVT_CALL: + case MONO_PATCH_INFO_VIRT_METHOD: + case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE: + g_free (entry_data); + break; + case MONO_PATCH_INFO_GSHAREDVT_METHOD: { + g_free (((MonoGSharedVtMethodInfo *) entry_data)->entries); + g_free (entry_data); + break; + } + default : + break; + } + + return result; } static gboolean gsharedvt_supported; |