From f59468ec1b04d2a1cabf6166e30f2272f535d5c4 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Thu, 3 Nov 2016 17:07:19 -0400 Subject: [PATCH] [runtime] Ensure generic type definition arity matches generic context arity Don't instantiate generic type definitions (like Dictionary`2) with too few or too many type arguments. Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=46250 --- mono/metadata/metadata.c | 2 ++ mono/metadata/reflection.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index bcff8a66261..36a954cd8b0 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -2959,6 +2959,8 @@ mono_metadata_lookup_generic_class (MonoClass *container_class, MonoGenericInst MonoImageSet *set; CollectData data; + g_assert (mono_class_get_generic_container (container_class)->type_argc == inst->type_argc); + memset (&helper, 0, sizeof(helper)); // act like g_new0 helper.container_class = container_class; helper.context.class_inst = inst; diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index 1076479daa0..88ecb5fddfd 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -2162,6 +2162,14 @@ mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_argc return NULL; } + guint gtd_type_argc = mono_class_get_generic_container (klass)->type_argc; + if (gtd_type_argc != type_argc) { + mono_loader_unlock (); + mono_error_set_argument (error, "types", "The generic type definition needs %d type arguments, but was instantiated with %d ", gtd_type_argc, type_argc); + return NULL; + } + + if (klass->wastypebuilder) is_dynamic = TRUE; -- 2.25.1