2009-05-29 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 29 May 2009 21:45:16 +0000 (21:45 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 29 May 2009 21:45:16 +0000 (21:45 -0000)
* metadata-verify.c: Implement field signature check.

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

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

index 1b7c9f5bdcb04e5713b5f6e9b8ca41a5eaeb5691..0de1f426c1031d431a667c28a52db96f77817a77 100644 (file)
@@ -1,3 +1,7 @@
+2009-05-29 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * metadata-verify.c: Implement field signature check.
+
 2009-05-29 Rodrigo Kumpera  <rkumpera@novell.com>
 
        * metadata-verify.c: Implement standalone signature check.
index 9945599def9623a2136bc90c52e170ea119bdd2f..87723c3a1ab7ae7852b05524d4eb03ed5a24811e 100644 (file)
@@ -1279,12 +1279,32 @@ parse_method_signature (VerifyContext *ctx, const char **_ptr, const char *end,
        return TRUE;
 }
 
+static gboolean
+parse_field (VerifyContext *ctx, const char **_ptr, const char *end)
+{
+       if (!parse_custom_mods (ctx, _ptr, end))
+               return FALSE;
+       return parse_type (ctx, _ptr, end);
+}
+
 static gboolean
 is_valid_field_signature (VerifyContext *ctx, guint32 offset)
 {
-       OffsetAndSize blob = get_metadata_stream (ctx, &ctx->image->heap_blob);
-       //TODO do proper verification
-       return blob.size >= 2 && blob.size - 2 >= offset;
+       int size = 0, signature = 0;
+       const char *ptr = NULL, *end;
+
+       if (!decode_signature_header (ctx, offset, &size, &ptr))
+               FAIL (ctx, g_strdup ("FieldSig: Could not decode signature header"));
+       end = ptr + size;
+
+       if (!safe_read8 (signature, ptr, end))
+               FAIL (ctx, g_strdup ("FieldSig: Not enough room for the signature"));
+
+       if (signature != 6)
+               FAIL (ctx, g_strdup_printf ("FieldSig: Invalid signature %x", signature));
+       --ptr;
+
+       return parse_field (ctx, &ptr, end);
 }
 
 static gboolean
@@ -1313,10 +1333,11 @@ is_valid_method_or_field_signature (VerifyContext *ctx, guint32 offset)
 
        if (!safe_read8 (signature, ptr, end))
                FAIL (ctx, g_strdup ("MemberRefSig: Not enough room for the call conv"));
-
-       if (signature == 0x06) //FIXME implement field sig checking
-               return TRUE;
        --ptr;
+
+       if (signature == 0x06)
+               return parse_field (ctx, &ptr, end);
+
        return parse_method_signature (ctx, &ptr, end, TRUE, FALSE);
 }