Skip to content

Commit

Permalink
Handle invalid instantiation of generic methods.
Browse files Browse the repository at this point in the history
	* 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
  • Loading branch information
kumpera committed Nov 25, 2010
1 parent 472119d commit 4905ef1
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
3 changes: 3 additions & 0 deletions mono/metadata/reflection.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
1 change: 1 addition & 0 deletions mono/metadata/verify-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
15 changes: 15 additions & 0 deletions mono/metadata/verify.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

0 comments on commit 4905ef1

Please sign in to comment.