2009-06-03 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 4 Jun 2009 02:27:57 +0000 (02:27 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 4 Jun 2009 02:27:57 +0000 (02:27 -0000)
* metadata-verify.c: Implement property signature check.

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

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

index 7dea17a07fdebcf5399902008ee304f1d9dde6eb..f4e458b4c136c5925434a3122c0a0d5829e5aaa4 100644 (file)
@@ -1,3 +1,7 @@
+2009-06-03 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * metadata-verify.c: Implement property signature check.
+
 2009-06-04  Mark Probst  <mark.probst@gmail.com>
 
        * sgen-gc.h: Register saving support for PPC.
index 87723c3a1ab7ae7852b05524d4eb03ed5a24811e..3059a4c1f2ad1012c90206ca0afe45be1cf34b8e 100644 (file)
@@ -1279,6 +1279,37 @@ parse_method_signature (VerifyContext *ctx, const char **_ptr, const char *end,
        return TRUE;
 }
 
+static gboolean
+parse_property_signature (VerifyContext *ctx, const char **_ptr, const char *end)
+{
+       unsigned sig = 0;
+       unsigned param_count = 0, i;
+       const char *ptr = *_ptr;
+
+       if (!safe_read8 (sig, ptr, end))
+               FAIL (ctx, g_strdup ("PropertySig: Not enough room for signature"));
+
+       if (sig != 0x08 && sig != 0x28)
+               FAIL (ctx, g_strdup_printf ("PropertySig: Signature is not 0x28 or 0x08: %x", sig));
+
+       if (!safe_read_cint (param_count, ptr, end))
+               FAIL (ctx, g_strdup ("PropertySig: Not enough room for the param count"));
+
+       if (!parse_custom_mods (ctx, &ptr, end))
+               return FALSE;
+
+       if (!parse_type (ctx, &ptr, end))
+               FAIL (ctx, g_strdup ("PropertySig: Could not parse property type"));
+
+       for (i = 0; i < param_count; ++i) {
+               if (!parse_type (ctx, &ptr, end))
+                       FAIL (ctx, g_strdup_printf ("PropertySig: Error parsing arg %d", i));
+       }
+
+       *_ptr = ptr;
+       return TRUE;
+}
+
 static gboolean
 parse_field (VerifyContext *ctx, const char **_ptr, const char *end)
 {
@@ -1389,9 +1420,14 @@ is_valid_standalonesig_blob (VerifyContext *ctx, guint32 offset)
 static gboolean
 is_valid_property_sig_blob (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;
+
+       if (!decode_signature_header (ctx, offset, &size, &ptr))
+               FAIL (ctx, g_strdup ("PropertySig: Could not decode signature header"));
+       end = ptr + size;
+
+       return parse_property_signature (ctx, &ptr, end);
 }
 
 static gboolean