Author: zoltan
Date: 2007-12-23 15:17:33 -0500 (Sun, 23 Dec 2007)
New Revision: 91841
Modified:
trunk/mono/mono/metadata/ChangeLog
trunk/mono/mono/metadata/class-internals.h
trunk/mono/mono/metadata/loader.c
Log:
2007-12-23 Zoltan Varga <[EMAIL PROTECTED]>
* loader.c (mono_get_method_from_token): Check the token type in the
dynamic case.
Fixes #342565.
* class-internals.h: Add new loader error type MONO_EXCEPTION_BAD_IMAGE
plus
a helper function for setting it.
* loader.c (mono_loader_error_prepare_exception): Handle
MONO_EXCEPTION_BAD_IMAGE.
Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog 2007-12-23 17:29:35 UTC (rev 91840)
+++ trunk/mono/mono/metadata/ChangeLog 2007-12-23 20:17:33 UTC (rev 91841)
@@ -1,5 +1,14 @@
2007-12-23 Zoltan Varga <[EMAIL PROTECTED]>
+ * loader.c (mono_get_method_from_token): Check the token type in the
dynamic case.
+ Fixes #342565.
+
+ * class-internals.h: Add new loader error type MONO_EXCEPTION_BAD_IMAGE
plus
+ a helper function for setting it.
+
+ * loader.c (mono_loader_error_prepare_exception): Handle
MONO_EXCEPTION_BAD_IMAGE.
+
+
* assembly.c: Significally simplify code now that referenced assemblies
are
loaded lazily. Get rid of the 'loading' hashtables. Hopefully fixes
#347629.
Modified: trunk/mono/mono/metadata/class-internals.h
===================================================================
--- trunk/mono/mono/metadata/class-internals.h 2007-12-23 17:29:35 UTC (rev
91840)
+++ trunk/mono/mono/metadata/class-internals.h 2007-12-23 20:17:33 UTC (rev
91841)
@@ -176,6 +176,7 @@
MONO_EXCEPTION_METHOD_ACCESS = 9,
MONO_EXCEPTION_FIELD_ACCESS = 10,
MONO_EXCEPTION_GENERIC_SHARING_FAILED = 11,
+ MONO_EXCEPTION_BAD_IMAGE = 12
/* add other exception type */
};
@@ -516,6 +517,7 @@
MonoClass *klass; /* If kind != TYPE */
const char *member_name; /* If kind != TYPE */
gboolean ref_only; /* If kind == ASSEMBLY */
+ char *msg; /* If kind == BAD_IMAGE */
} MonoLoaderError;
#define mono_class_has_parent(klass,parent) (((klass)->idepth >=
(parent)->idepth) && ((klass)->supertypes [(parent)->idepth - 1] == (parent)))
@@ -798,6 +800,8 @@
void
mono_loader_set_error_field_load (MonoClass *klass, const char *member_name)
MONO_INTERNAL;
+void
+mono_loader_set_error_bad_image (char *msg) MONO_INTERNAL;
MonoException *
mono_loader_error_prepare_exception (MonoLoaderError *error) MONO_INTERNAL;
Modified: trunk/mono/mono/metadata/loader.c
===================================================================
--- trunk/mono/mono/metadata/loader.c 2007-12-23 17:29:35 UTC (rev 91840)
+++ trunk/mono/mono/metadata/loader.c 2007-12-23 20:17:33 UTC (rev 91841)
@@ -191,6 +191,27 @@
}
/*
+ * mono_loader_set_error_bad_image:
+ *
+ * Set the loader error for this thread.
+ */
+void
+mono_loader_set_error_bad_image (char *msg)
+{
+ MonoLoaderError *error;
+
+ if (mono_loader_get_last_error ())
+ return;
+
+ error = g_new0 (MonoLoaderError, 1);
+ error->exception_type = MONO_EXCEPTION_BAD_IMAGE;
+ error->msg = msg;
+
+ set_loader_error (error);
+}
+
+
+/*
* mono_loader_get_last_error:
*
* Returns information about the last type load exception encountered by the
loader, or
@@ -215,6 +236,7 @@
if (ex) {
g_free (ex->class_name);
g_free (ex->assembly_name);
+ g_free (ex->msg);
g_free (ex);
TlsSetValue (loader_error_thread_id, NULL);
@@ -244,10 +266,10 @@
class_name = mono_string_new (mono_domain_get (), cname);
- ex = mono_get_exception_type_load (class_name, aname);
+ ex = mono_get_exception_type_load (class_name, aname);
g_free (cname);
g_free (aname);
- break;
+ break;
}
case MONO_EXCEPTION_MISSING_METHOD: {
char *cname = g_strdup (error->class_name);
@@ -270,11 +292,11 @@
class_name = g_strdup_printf ("%s%s%s", cnspace, cnspace ? "."
: "", cname);
ex = mono_get_exception_missing_field (class_name, cmembername);
- g_free (class_name);
+ g_free (class_name);
g_free (cname);
g_free (cmembername);
g_free (cnspace);
- break;
+ break;
}
case MONO_EXCEPTION_FILE_NOT_FOUND: {
@@ -293,7 +315,15 @@
g_free (filename);
break;
}
-
+
+ case MONO_EXCEPTION_BAD_IMAGE: {
+ char *msg = g_strdup (error->msg);
+ mono_loader_clear_error ();
+ ex = mono_get_exception_bad_image_format (msg);
+ g_free (msg);
+ break;
+ }
+
default:
g_assert_not_reached ();
}
@@ -1282,8 +1312,13 @@
int size, i;
guint32 cols [MONO_TYPEDEF_SIZE];
- if (image->dynamic)
+ if (image->dynamic) {
+ if (table != MONO_TABLE_METHOD && table !=
MONO_TABLE_METHODSPEC && table != MONO_TABLE_MEMBERREF) {
+ mono_loader_set_error_bad_image (g_strdup ("Bad method
token."));
+ return NULL;
+ }
return mono_lookup_dynamic_token (image, token, context);
+ }
if (table != MONO_TABLE_METHOD) {
if (table == MONO_TABLE_METHODSPEC) {
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches