2009-06-24 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Wed, 24 Jun 2009 22:45:30 +0000 (22:45 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 24 Jun 2009 22:45:30 +0000 (22:45 -0000)
* class.c (mono_class_find_enum_basetype): Call into the verifier to
check the field signature. Replace an assert with an explicit check.

* class.c (mono_class_setup_fields): Call into the verifier to check
the field signature.

* metadata-verify.c: Add mono_verifier_verify_field_signature.

* verify-internals.h: Export mono_verifier_verify_field_signature as
part of the internal API.

svn path=/trunk/mono/; revision=136797

mono/metadata/ChangeLog
mono/metadata/class.c
mono/metadata/metadata-verify.c
mono/metadata/verify-internals.h

index 72629097638940acca2c62db375f2464cf3381a9..b0b29c7433f1f7530027fa46cc253d0c2b63ecbb 100644 (file)
@@ -1,3 +1,16 @@
+2009-06-24 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * class.c (mono_class_find_enum_basetype): Call into the verifier to
+       check the field signature. Replace an assert with an explicit check.
+
+       * class.c (mono_class_setup_fields): Call into the verifier to check
+       the field signature.
+
+       * metadata-verify.c: Add mono_verifier_verify_field_signature.
+
+       * verify-internals.h: Export mono_verifier_verify_field_signature as
+       part of the internal API.
+
 2009-06-24 Rodrigo Kumpera  <rkumpera@novell.com>
 
        * class.c (mono_class_find_enum_basetype): Simplify this function
index 1db7b3ff61435d69b32a1f99d42accdb087eb619..1924290e56e9fab135c5a909e6560495b261c03d 100644 (file)
@@ -1023,11 +1023,15 @@ mono_class_find_enum_basetype (MonoClass *class)
 
                if (cols [MONO_FIELD_FLAGS] & FIELD_ATTRIBUTE_STATIC) //no need to decode static fields
                        continue;
-               
+
+               if (!mono_verifier_verify_field_signature (class->image, cols [MONO_FIELD_SIGNATURE], NULL))
+                       return NULL;
+
                sig = mono_metadata_blob_heap (m, cols [MONO_FIELD_SIGNATURE]);
                mono_metadata_decode_value (sig, &sig);
                /* FIELD signature == 0x06 */
-               g_assert (*sig == 0x06);
+               if (*sig != 0x06)
+                       return NULL;
 
                ftype = mono_metadata_parse_type_full (m, container, MONO_PARSE_FIELD, cols [MONO_FIELD_FLAGS], sig + 1, &sig);
                if (!ftype)
@@ -1181,6 +1185,10 @@ mono_class_setup_fields (MonoClass *class)
                        mono_metadata_decode_table_row (m, MONO_TABLE_FIELD, idx, cols, MONO_FIELD_SIZE);
                        /* The name is needed for fieldrefs */
                        field->name = mono_metadata_string_heap (m, cols [MONO_FIELD_NAME]);
+                       if (!mono_verifier_verify_field_signature (class->image, cols [MONO_FIELD_SIGNATURE], NULL)) {
+                               mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+                               break;
+                       }
                        sig = mono_metadata_blob_heap (m, cols [MONO_FIELD_SIGNATURE]);
                        mono_metadata_decode_value (sig, &sig);
                        /* FIELD signature == 0x06 */
index 8edf11edce1d15297d7933cd4338c1327eb92642..2236ab78b8be1c81242dd7607537a8e508ee7e3d 100644 (file)
@@ -3346,6 +3346,21 @@ cleanup:
        return cleanup_context (&ctx, error_list);
 }
 
+gboolean
+mono_verifier_verify_field_signature (MonoImage *image, guint32 offset, GSList **error_list)
+{
+       VerifyContext ctx;
+
+       if (!mono_verifier_is_enabled_for_image (image))
+               return TRUE;
+
+       init_verify_context (&ctx, image, error_list);
+       ctx.stage = STAGE_TABLES;
+
+       is_valid_field_signature (&ctx, offset);
+       return cleanup_context (&ctx, error_list);
+}
+
 #else
 gboolean
 mono_verifier_verify_table_data (MonoImage *image, GSList **error_list)
@@ -3371,4 +3386,10 @@ mono_verifier_verify_full_table_data (MonoImage *image, GSList **error_list)
        return TRUE;
 }
 
+gboolean
+mono_verifier_verify_field_signature (MonoImage *image, guint32 offset, GSList **error_list)
+{
+       return TRUE;
+}
+
 #endif /* DISABLE_VERIFIER */
index 7e3c478afabc84d33d9695e0098dd93a5f3997cc..32767f884486353e42dfbbe1f2501b19d1d639c9 100644 (file)
@@ -32,6 +32,8 @@ gboolean mono_verifier_verify_table_data (MonoImage *image, GSList **error_list)
 
 gboolean mono_verifier_verify_full_table_data (MonoImage *image, GSList **error_list) MONO_INTERNAL;
 
+gboolean mono_verifier_verify_field_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
+
 G_END_DECLS
 
 #endif  /* __MONO_METADATA_VERIFY_INTERNAL_H__ */