Skip to content

Commit 7a528f6

Browse files
lambdageekvargaz
authored andcommitted
[sre] Unlock loader lock on error paths (mono#6951)
1 parent e572acc commit 7a528f6

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

mono/metadata/reflection.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,11 @@ mono_type_get_object_checked (MonoDomain *domain, MonoType *type, MonoError *err
490490
norm_type = mono_type_normalize (type);
491491
if (norm_type != type) {
492492
res = mono_type_get_object_checked (domain, norm_type, error);
493-
if (!mono_error_ok (error))
493+
if (!mono_error_ok (error)) {
494+
mono_domain_unlock (domain);
495+
mono_loader_unlock ();
494496
return NULL;
497+
}
495498
mono_g_hash_table_insert (domain->type_hash, type, res);
496499
mono_domain_unlock (domain);
497500
mono_loader_unlock ();
@@ -528,8 +531,11 @@ mono_type_get_object_checked (MonoDomain *domain, MonoType *type, MonoError *err
528531
}
529532
/* This is stored in vtables/JITted code so it has to be pinned */
530533
res = (MonoReflectionType *)mono_object_new_pinned (domain, mono_defaults.runtimetype_class, error);
531-
if (!mono_error_ok (error))
534+
if (!mono_error_ok (error)) {
535+
mono_domain_unlock (domain);
536+
mono_loader_unlock ();
532537
return NULL;
538+
}
533539

534540
res->type = type;
535541
mono_g_hash_table_insert (domain->type_hash, type, res);

mono/metadata/sre.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3064,8 +3064,10 @@ ctorbuilder_to_mono_method (MonoClass *klass, MonoReflectionCtorBuilder* mb, Mon
30643064

30653065
mono_loader_lock ();
30663066

3067-
if (!mono_reflection_methodbuilder_from_ctor_builder (&rmb, mb, error))
3067+
if (!mono_reflection_methodbuilder_from_ctor_builder (&rmb, mb, error)) {
3068+
mono_loader_unlock ();
30683069
return NULL;
3070+
}
30693071

30703072
g_assert (klass->image != NULL);
30713073
sig = ctor_builder_to_signature_raw (klass->image, mb, error); /* FIXME use handles */
@@ -3095,8 +3097,10 @@ methodbuilder_to_mono_method (MonoClass *klass, MonoReflectionMethodBuilderHandl
30953097
mono_loader_lock ();
30963098

30973099
MonoReflectionMethodBuilder *mb = MONO_HANDLE_RAW (ref_mb); /* FIXME use handles */
3098-
if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error))
3100+
if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error)) {
3101+
mono_loader_unlock ();
30993102
return NULL;
3103+
}
31003104

31013105
g_assert (klass->image != NULL);
31023106
sig = method_builder_to_signature (klass->image, ref_mb, error);

0 commit comments

Comments
 (0)