Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > c0990dfa53ceeeae8944e749a851ce8f > files > 4

mono-2.6.7-4.fc14.src.rpm

From 4905ef1130feb26c3150b28b97e4a96752e0d399 Mon Sep 17 00:00:00 2001
From: Rodrigo Kumpera <kumpera@gmail.com>
Date: Thu, 25 Nov 2010 14:23:31 -0200
Subject: [PATCH] Handle invalid instantiation of generic methods.

	* verify.c: Add new function to internal verifier API to check
	method instantiations.

	* reflection.c (mono_reflection_bind_generic_method_parameters):
	Check the instantiation before returning it.

	Fixes #655847
---
 mono/metadata/reflection.c       |    3 +++
 mono/metadata/verify-internals.h |    1 +
 mono/metadata/verify.c           |   15 +++++++++++++++
 3 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c
index 3ba44ea..f7905f6 100644
--- a/mono/metadata/reflection.c
+++ b/mono/metadata/reflection.c
@@ -10176,6 +10176,9 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
 		mono_g_hash_table_insert (image->generic_def_objects, imethod, rmethod);
 		mono_loader_unlock ();
 	}
+
+	if (!mono_verifier_is_method_valid_generic_instantiation (inflated))
+		mono_raise_exception (mono_get_exception_argument ("typeArguments", "Invalid generic arguments"));
 	
 	return mono_method_get_object (mono_object_domain (rmethod), inflated, NULL);
 }
diff --git a/mono/metadata/verify-internals.h b/mono/metadata/verify-internals.h
index f73b010..a95cc5d 100644
--- a/mono/metadata/verify-internals.h
+++ b/mono/metadata/verify-internals.h
@@ -22,6 +22,7 @@ gboolean mono_verifier_is_enabled_for_class (MonoClass *klass) MONO_INTERNAL;
 gboolean mono_verifier_is_method_full_trust (MonoMethod *method) MONO_INTERNAL;
 gboolean mono_verifier_is_class_full_trust (MonoClass *klass) MONO_INTERNAL;
 gboolean mono_verifier_class_is_valid_generic_instantiation (MonoClass *class) MONO_INTERNAL;
+gboolean mono_verifier_is_method_valid_generic_instantiation (MonoMethod *method) MONO_INTERNAL;
 
 gboolean mono_verifier_verify_class (MonoClass *klass) MONO_INTERNAL;
 
diff --git a/mono/metadata/verify.c b/mono/metadata/verify.c
index b678ed7..2b393a9 100644
--- a/mono/metadata/verify.c
+++ b/mono/metadata/verify.c
@@ -6533,6 +6533,14 @@ mono_verifier_class_is_valid_generic_instantiation (MonoClass *class)
 	return mono_class_is_valid_generic_instantiation (NULL, class);
 }
 
+gboolean
+mono_verifier_is_method_valid_generic_instantiation (MonoMethod *method)
+{
+	if (!method->is_inflated)
+		return TRUE;
+	return mono_method_is_valid_generic_instantiation (NULL, method);
+}
+
 #else
 
 gboolean
@@ -6611,5 +6619,12 @@ mono_verifier_class_is_valid_generic_instantiation (MonoClass *class)
 	return TRUE;
 }
 
+gboolean
+mono_verifier_is_method_valid_generic_instantiation (MonoMethod *method)
+{
+	return TRUE;
+}
+
+
 
 #endif
-- 
1.7.3.4