2010-01-18 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 18 Jan 2010 22:25:07 +0000 (22:25 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Mon, 18 Jan 2010 22:25:07 +0000 (22:25 -0000)
* metadata-verify.c (parse_type): Fail a type signature if it has a recursive reference
to itself.

* metadata-verify.c (mono_verifier_verify_typespec_signature): Change signature to take
the token as parameter.

* verify-internals.h: Ditto.

* metadata.c (mono_type_create_from_typespec): Pass token to verifier.

Fixes #571460.

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

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

index 18330440e1073347a39e849be22437fce3adb8e2..2861b953e23d4b40f4ee55d83668074a1dbc71c2 100644 (file)
@@ -1,3 +1,17 @@
+2010-01-18  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * metadata-verify.c (parse_type): Fail a type signature if it has a recursive reference
+       to itself.
+
+       * metadata-verify.c (mono_verifier_verify_typespec_signature): Change signature to take
+       the token as parameter.
+
+       * verify-internals.h: Ditto.
+
+       * metadata.c (mono_type_create_from_typespec): Pass token to verifier.
+
+       Fixes #571460.
+
 2010-01-18  Mark Probst  <mark.probst@gmail.com>
 
        * sgen-gc.c: Make store_remset_buffer_index long.
index bbe30470aadfd6d81540e7fad716c246e5d1a397..0f99fbca38a60cf4d9fbab63818e54e51cb7a077 100644 (file)
@@ -217,7 +217,7 @@ typedef struct {
 
 typedef struct {
        const char *data;
-       guint32 size;
+       guint32 size, token;
        GSList *errors;
        int valid;
        MonoImage *image;
@@ -1319,6 +1319,11 @@ parse_type (VerifyContext *ctx, const char **_ptr, const char *end)
        
                if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, token))
                        FAIL (ctx, g_strdup_printf ("Type: invalid TypeDefOrRef token %x", token));
+               if (ctx->token) {
+                       if (mono_metadata_token_index (ctx->token) == get_coded_index_token (TYPEDEF_OR_REF_DESC, token) &&
+                               mono_metadata_token_table (ctx->token) == get_coded_index_table (TYPEDEF_OR_REF_DESC, token))
+                               FAIL (ctx, g_strdup_printf ("Type: Recurside type specification (%x). A type signature can't reference itself", ctx->token));
+               }
                break;
 
        case MONO_TYPE_VAR:
@@ -2901,10 +2906,11 @@ verify_typespec_table_full (VerifyContext *ctx)
 
        for (i = 0; i < table->rows; ++i) {
                mono_metadata_decode_row (table, i, data, MONO_TYPESPEC_SIZE);
-
+               ctx->token = (i + 1) | MONO_TOKEN_TYPE_SPEC;
                if (!is_valid_typespec_blob (ctx, data [MONO_TYPESPEC_SIGNATURE]))
                        ADD_ERROR (ctx, g_strdup_printf ("Invalid TypeSpec row %d Signature field %08x", i, data [MONO_TYPESPEC_SIGNATURE]));
        }
+       ctx->token = 0;
 }
 
 #define INVALID_IMPLMAP_FLAGS_BITS ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 6) | (1 << 8) | (1 << 9) | (1 << 10))
@@ -3642,7 +3648,7 @@ mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSL
 }
 
 gboolean
-mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list)
+mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list)
 {
        VerifyContext ctx;
 
@@ -3651,6 +3657,7 @@ mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSLis
 
        init_verify_context (&ctx, image, error_list);
        ctx.stage = STAGE_TABLES;
+       ctx.token = token;
 
        is_valid_typespec_blob (&ctx, offset);
        return cleanup_context (&ctx, error_list);
@@ -3792,7 +3799,7 @@ mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSL
 }
 
 gboolean
-mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list)
+mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list)
 {
        return TRUE;
 }
index 5e70c82b2287794bc52612aba934e30f0c1ad867..af56ebb0b118bad0cafc5600cc2084860e30a548 100644 (file)
@@ -5085,7 +5085,7 @@ mono_type_create_from_typespec (MonoImage *image, guint32 type_spec)
        mono_metadata_decode_row (t, idx-1, cols, MONO_TYPESPEC_SIZE);
        ptr = mono_metadata_blob_heap (image, cols [MONO_TYPESPEC_SIGNATURE]);
 
-       if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], NULL)) {
+       if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], type_spec, NULL)) {
                mono_loader_unlock ();
                return NULL;
        }
index c692c768f52f306e216ad06cdd508bcd355c0ebc..6019b3184fb54bdca04d88bcff99582ee28f479e 100644 (file)
@@ -37,7 +37,7 @@ gboolean mono_verifier_verify_method_header (MonoImage *image, guint32 offset, G
 gboolean mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
 gboolean mono_verifier_verify_memberref_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
 gboolean mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
-gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
+gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list) MONO_INTERNAL;
 gboolean mono_verifier_verify_methodspec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
 gboolean mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
 gboolean mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature) MONO_INTERNAL;