2009-06-09 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 9 Jun 2009 22:55:14 +0000 (22:55 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 9 Jun 2009 22:55:14 +0000 (22:55 -0000)
* metadata-verify.c: Verify methodspec signatures.

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

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

index 34261bb33b80f56e98a11a1ebacf3f234596450e..fdc1151369b5d7b4aac3195ed62c6ee170fa236f 100644 (file)
@@ -1,3 +1,7 @@
+2009-06-09 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * metadata-verify.c: Verify methodspec signatures.
+
 2009-06-09 Rodrigo Kumpera  <rkumpera@novell.com>
 
        * metadata-verify.c: Verify typespec signatures.
index 2fd6aed5c5ea652084ee156414fc210d2f245c66..f3ad794be5f6894a9e51e23085aab2e3136aad0d 100644 (file)
@@ -1636,9 +1636,32 @@ is_valid_typespec_blob (VerifyContext *ctx, guint32 offset)
 static gboolean
 is_valid_methodspec_blog (VerifyContext *ctx, guint32 offset)
 {
-       OffsetAndSize blob = get_metadata_stream (ctx, &ctx->image->heap_blob);
-       //TODO do proper verification
-       return offset > 0 && blob.size >= 1 && blob.size - 1 >= offset;
+       int size = 0;
+       const char *ptr = NULL, *end;
+       guint8 type = 0;
+       guint32 count = 0, i;
+
+       if (!decode_signature_header (ctx, offset, &size, &ptr))
+               FAIL (ctx, g_strdup ("MethodSpec: Could not decode signature header"));
+       end = ptr + size;
+
+       if (!safe_read8 (type, ptr, end))
+               FAIL (ctx, g_strdup ("MethodSpec: Not enough room for call convention"));
+
+       if (type != 0x0A)
+               FAIL (ctx, g_strdup_printf ("MethodSpec: Invalid call convention 0x%x, expected 0x0A", type));
+
+       if (!safe_read_cint (count, ptr, end))
+               FAIL (ctx, g_strdup ("MethodSpec: Not enough room for parameter count"));
+
+       if (!count)
+               FAIL (ctx, g_strdup ("MethodSpec: Zero generic argument count"));
+
+       for (i = 0; i < count; ++i) {
+               if (!parse_type (ctx, &ptr, end))
+                       FAIL (ctx, g_strdup_printf ("MethodSpec: Could not parse parameter %d", i + 1));
+       }
+       return TRUE;
 }
 
 static gboolean