From: Zoltan Varga Date: Fri, 24 Jul 2020 09:23:38 +0000 (-0400) Subject: [runtime] Fix some more gc tracking problems in create_cattr_named/typed_arg. (#39856) X-Git-Tag: submit/tizen/20210909.063632~6448 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd7edf82e36e6c350a2c3fef0a0c2b69e8c11d61;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [runtime] Fix some more gc tracking problems in create_cattr_named/typed_arg. (#39856) --- diff --git a/src/mono/mono/metadata/custom-attrs.c b/src/mono/mono/metadata/custom-attrs.c index 344ebbd..648f5a0 100644 --- a/src/mono/mono/metadata/custom-attrs.c +++ b/src/mono/mono/metadata/custom-attrs.c @@ -489,6 +489,7 @@ MONO_RESTORE_WARNING case MONO_TYPE_SZARRAY: { MonoArray *arr; guint32 i, alen, basetype; + if (!bcheck_blob (p, 3, boundp, error)) return NULL; alen = read32 (p); @@ -497,8 +498,10 @@ MONO_RESTORE_WARNING *end = p; return NULL; } + arr = mono_array_new_checked (mono_domain_get(), tklass, alen, error); return_val_if_nok (error, NULL); + basetype = m_class_get_byval_arg (tklass)->type; if (basetype == MONO_TYPE_VALUETYPE && m_class_is_enumtype (tklass)) basetype = mono_class_enum_basetype_internal (tklass)->type; @@ -569,7 +572,10 @@ MONO_RESTORE_WARNING case MONO_TYPE_CLASS: case MONO_TYPE_OBJECT: case MONO_TYPE_STRING: - case MONO_TYPE_SZARRAY: + case MONO_TYPE_SZARRAY: { + HANDLE_FUNCTION_ENTER (); + MONO_HANDLE_NEW (MonoArray, arr); + for (i = 0; i < alen; i++) { MonoObject *item = NULL; load_cattr_value (image, m_class_get_byval_arg (tklass), &item, p, boundp, &p, error); @@ -577,13 +583,16 @@ MONO_RESTORE_WARNING return NULL; mono_array_setref_internal (arr, i, item); } + HANDLE_FUNCTION_RETURN (); break; + } default: g_error ("Type 0x%02x not handled in custom attr array decoding", basetype); } *end = p; g_assert (out_obj); *out_obj = (MonoObject*)arr; + return NULL; } default: @@ -618,13 +627,15 @@ load_cattr_value_boxed (MonoDomain *domain, MonoImage *image, MonoType *t, const } static MonoObject* -create_cattr_typed_arg (MonoType *t, MonoObjectHandleOut res_h, MonoObject *val, MonoError *error) +create_cattr_typed_arg (MonoType *t, MonoObject *val, MonoError *error) { MonoObject *retval; void *params [2], *unboxed; error_init (error); + HANDLE_FUNCTION_ENTER (); + MONO_STATIC_POINTER_INIT (MonoMethod, ctor) ctor = mono_class_get_method_from_name_checked (mono_class_get_custom_attribute_typed_argument_class (), ".ctor", 2, 0, error); @@ -634,29 +645,33 @@ create_cattr_typed_arg (MonoType *t, MonoObjectHandleOut res_h, MonoObject *val, params [0] = mono_type_get_object_checked (mono_domain_get (), t, error); return_val_if_nok (error, NULL); + MONO_HANDLE_PIN ((MonoObject*)params [0]); params [1] = val; retval = mono_object_new_checked (mono_domain_get (), mono_class_get_custom_attribute_typed_argument_class (), error); return_val_if_nok (error, NULL); - /* This will keep retval pinned during the runtime invoke */ - MONO_HANDLE_ASSIGN_RAW (res_h, retval); + MONO_HANDLE_PIN (retval); unboxed = mono_object_unbox_internal (retval); mono_runtime_invoke_checked (ctor, unboxed, params, error); return_val_if_nok (error, NULL); + HANDLE_FUNCTION_RETURN (); + return retval; } static MonoObject* -create_cattr_named_arg (void *minfo, MonoObjectHandleOut res_h, MonoObject *typedarg, MonoError *error) +create_cattr_named_arg (void *minfo, MonoObject *typedarg, MonoError *error) { MonoObject *retval; void *unboxed, *params [2]; error_init (error); + HANDLE_FUNCTION_ENTER (); + MONO_STATIC_POINTER_INIT (MonoMethod, ctor) ctor = mono_class_get_method_from_name_checked (mono_class_get_custom_attribute_named_argument_class (), ".ctor", 2, 0, error); @@ -668,14 +683,15 @@ create_cattr_named_arg (void *minfo, MonoObjectHandleOut res_h, MonoObject *type params [1] = typedarg; retval = mono_object_new_checked (mono_domain_get (), mono_class_get_custom_attribute_named_argument_class (), error); return_val_if_nok (error, NULL); - /* This will keep retval pinned during the runtime invoke */ - MONO_HANDLE_ASSIGN_RAW (res_h, retval); + MONO_HANDLE_PIN (retval); unboxed = mono_object_unbox_internal (retval); mono_runtime_invoke_checked (ctor, unboxed, params, error); return_val_if_nok (error, NULL); + HANDLE_FUNCTION_RETURN (); + return retval; } @@ -1352,7 +1368,7 @@ ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoRe MonoReflectionMethod *ref_method = MONO_HANDLE_RAW (ref_method_h); MonoReflectionAssembly *assembly = MONO_HANDLE_RAW (assembly_h); MonoMethodSignature *sig; - MonoObjectHandle obj_h, namedarg_h, typedarg_h, minfo_h, arg_h; + MonoObjectHandle obj_h, namedarg_h, typedarg_h, minfo_h; int i; if (len == 0) @@ -1362,7 +1378,6 @@ ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoRe namedarg_h = MONO_HANDLE_NEW (MonoObject, NULL); typedarg_h = MONO_HANDLE_NEW (MonoObject, NULL); minfo_h = MONO_HANDLE_NEW (MonoObject, NULL); - arg_h = MONO_HANDLE_NEW (MonoObject, NULL); image = assembly->assembly->image; method = ref_method->method; @@ -1394,7 +1409,7 @@ ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoRe t = sig->params [i]; if (t->type == MONO_TYPE_OBJECT && obj) t = m_class_get_byval_arg (obj->vtable->klass); - typedarg = create_cattr_typed_arg (t, arg_h, obj, error); + typedarg = create_cattr_typed_arg (t, obj, error); goto_if_nok (error, leave); mono_array_setref_internal (typed_args, i, typedarg); } @@ -1416,13 +1431,13 @@ ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoRe MONO_HANDLE_ASSIGN_RAW (minfo_h, minfo); #if ENABLE_NETCORE - namedarg = create_cattr_named_arg (minfo, arg_h, obj, error); + namedarg = create_cattr_named_arg (minfo, obj, error); MONO_HANDLE_ASSIGN_RAW (namedarg_h, namedarg); #else - MonoObject* typedarg = create_cattr_typed_arg (arginfo [i].type, arg_h, obj, error); + MonoObject* typedarg = create_cattr_typed_arg (arginfo [i].type, obj, error); MONO_HANDLE_ASSIGN_RAW (typedarg_h, typedarg); goto_if_nok (error, leave); - namedarg = create_cattr_named_arg (minfo, arg_h, typedarg, error); + namedarg = create_cattr_named_arg (minfo, typedarg, error); MONO_HANDLE_ASSIGN_RAW (namedarg_h, namedarg); #endif goto_if_nok (error, leave); diff --git a/src/mono/mono/metadata/handle.h b/src/mono/mono/metadata/handle.h index 2cedc51..6a9ad05 100644 --- a/src/mono/mono/metadata/handle.h +++ b/src/mono/mono/metadata/handle.h @@ -516,6 +516,9 @@ TYPED_HANDLE_DECL (MonoObject); TYPED_HANDLE_DECL (MonoException); TYPED_HANDLE_DECL (MonoAppContext); +/* Simpler version of MONO_HANDLE_NEW if the handle is not used */ +#define MONO_HANDLE_PIN(object) MONO_HANDLE_NEW (MonoObject, (object)) + // Structs cannot be cast to structs. // As well, a function is needed because an anonymous struct cannot be initialized in C. static inline MonoObjectHandle