Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/mono
diff options
context:
space:
mode:
authorFan Yang <52458914+fanyang-mono@users.noreply.github.com>2021-06-17 16:21:46 +0300
committerGitHub <noreply@github.com>2021-06-17 16:21:46 +0300
commit284cb67f65098660f5764c8044f42c098cbe8934 (patch)
treec1b00a93cad417e8e43d29f7c459e9ee60618810 /mono
parent165d8666e19a89304eb0c993063b876899f36f82 (diff)
Fix memory leak during data registration (#21107)
Diffstat (limited to 'mono')
-rw-r--r--mono/mini/mini-generic-sharing.c30
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;