Explorar o código

2009-08-24 Rodrigo Kumpera <[email protected]>

	* verify.c (mono_verifier_verify_class): Check fields for
	invalid generic arguments.

svn path=/trunk/mono/; revision=140571
Rodrigo Kumpera %!s(int64=16) %!d(string=hai) anos
pai
achega
5c45bd728e
Modificáronse 2 ficheiros con 25 adicións e 1 borrados
  1. 5 0
      mono/metadata/ChangeLog
  2. 20 1
      mono/metadata/verify.c

+ 5 - 0
mono/metadata/ChangeLog

@@ -1,3 +1,8 @@
+2009-08-24  Rodrigo Kumpera  <[email protected]>
+
+	* verify.c (mono_verifier_verify_class): Check fields for
+	invalid generic arguments.
+
 2009-08-24  Rodrigo Kumpera  <[email protected]>
 
 	* class.c (verify_class_overrides): Verify if for static

+ 20 - 1
mono/metadata/verify.c

@@ -5994,6 +5994,24 @@ verify_class_for_overlapping_reference_fields (MonoClass *class)
 	return TRUE;
 }
 
+static gboolean
+verify_class_fields (MonoClass *class)
+{
+	int i, count;
+	MonoGenericContext *context = mono_class_get_context (class);
+	if (class->generic_container)
+		context = &class->generic_container->context;
+
+	count = class->field.count;
+	for (i = 0; i < count; ++i) {
+		MonoClassField *field = &class->fields [i];
+
+		if (!mono_type_is_valid_type_in_context (field->type, context))
+			return FALSE;
+	}
+	return TRUE;
+}
+
 /*
  * Check if the class is verifiable.
  * 
@@ -6010,9 +6028,10 @@ mono_verifier_verify_class (MonoClass *class)
 		return FALSE;
 	if (!verify_class_for_overlapping_reference_fields (class))
 		return FALSE;
-	
 	if (class->generic_class && !mono_class_is_valid_generic_instantiation (NULL, class))
 		return FALSE;
+	if (!verify_class_fields (class))
+		return FALSE;
 	return TRUE;
 }
 #else