From 2c81a2f11819e1f4c116fe167ec4909f539717da Mon Sep 17 00:00:00 2001 From: Jay Krell Date: Thu, 12 Dec 2019 15:45:36 -0800 Subject: [PATCH] Fix on-demand initialization race conditions [reflection.c]. (mono/mono#18167) Fix on-demand initialization race conditions [reflection.c]. Extracted from https://github.com/mono/mono/pull/18150 which reviewer said was too big. Commit migrated from https://github.com/mono/mono/commit/1fe3d7eda6e7eaacd3b742823c97b04a13c37720 --- src/mono/mono/metadata/reflection.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mono/mono/metadata/reflection.c b/src/mono/mono/metadata/reflection.c index f51f139..69e39b9 100644 --- a/src/mono/mono/metadata/reflection.c +++ b/src/mono/mono/metadata/reflection.c @@ -914,15 +914,16 @@ static MonoObjectHandle mono_get_reflection_missing_object (MonoDomain *domain) { ERROR_DECL (error); - static MonoClassField *missing_value_field = NULL; - - if (!missing_value_field) { - MonoClass *missing_klass; - missing_klass = mono_class_get_missing_class (); + + MONO_STATIC_POINTER_INIT (MonoClassField, missing_value_field) + + MonoClass *missing_klass = mono_class_get_missing_class (); mono_class_init_internal (missing_klass); missing_value_field = mono_class_get_field_from_name_full (missing_klass, "Value", NULL); g_assert (missing_value_field); - } + + MONO_STATIC_POINTER_INIT_END (MonoClassField, missing_value_field) + /* FIXME change mono_field_get_value_object_checked to return a handle */ MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_field_get_value_object_checked (domain, missing_value_field, NULL, error)); mono_error_assert_ok (error); @@ -932,16 +933,16 @@ mono_get_reflection_missing_object (MonoDomain *domain) static MonoObjectHandle get_dbnull_object (MonoDomain *domain, MonoError *error) { - static MonoClassField *dbnull_value_field = NULL; - error_init (error); - if (!dbnull_value_field) { - MonoClass *dbnull_klass; - dbnull_klass = mono_class_get_dbnull_class (); + MONO_STATIC_POINTER_INIT (MonoClassField, dbnull_value_field) + + MonoClass *dbnull_klass = mono_class_get_dbnull_class (); dbnull_value_field = mono_class_get_field_from_name_full (dbnull_klass, "Value", NULL); g_assert (dbnull_value_field); - } + + MONO_STATIC_POINTER_INIT_END (MonoClassField, dbnull_value_field) + /* FIXME change mono_field_get_value_object_checked to return a handle */ MonoObjectHandle obj = MONO_HANDLE_NEW (MonoObject, mono_field_get_value_object_checked (domain, dbnull_value_field, NULL, error)); return obj; -- 2.7.4