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

Reply via email to