r100168 - trunk/mono/mono/metadata

0 views
Skip to first unread message

Rodrigo Kumpera (kumpera@gmail.com)

unread,
Apr 8, 2008, 6:55:51 PM4/8/08
to mono-p...@lists.ximian.com, ximian....@gmail.com, mono-svn-patche...@googlegroups.com
Author: kumpera
Date: 2008-04-08 18:55:51 -0400 (Tue, 08 Apr 2008)
New Revision: 100168

Modified:
trunk/mono/mono/metadata/ChangeLog
trunk/mono/mono/metadata/pedump.c
trunk/mono/mono/metadata/verify-internals.h
trunk/mono/mono/metadata/verify.c
Log:
2008-04-08 Rodrigo Kumpera <rkum...@novell.com>

* verify-internal.h: Added mono_verifier_verify_class.

* verify.c: Added mono_verifier_verify_class. It checks for
classes with explicit layout that have overlapping reference fields.

* pedump.c: Init the verifier state prior to verification. Fixed
command line arguments.

Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog 2008-04-08 22:47:55 UTC (rev 100167)
+++ trunk/mono/mono/metadata/ChangeLog 2008-04-08 22:55:51 UTC (rev 100168)
@@ -1,5 +1,15 @@
2008-04-08 Rodrigo Kumpera <rkum...@novell.com>

+ * verify-internal.h: Added mono_verifier_verify_class.
+
+ * verify.c: Added mono_verifier_verify_class. It checks for
+ classes with explicit layout that have overlapping reference fields.
+
+ * pedump.c: Init the verifier state prior to verification. Fixed
+ command line arguments.
+
+2008-04-08 Rodrigo Kumpera <rkum...@novell.com>
+
* Makefile.am: Added verify-internals.h, hopefully fix the build.

2008-04-08 Zoltan Varga <var...@gmail.com>

Modified: trunk/mono/mono/metadata/pedump.c
===================================================================
--- trunk/mono/mono/metadata/pedump.c 2008-04-08 22:47:55 UTC (rev 100167)
+++ trunk/mono/mono/metadata/pedump.c 2008-04-08 22:55:51 UTC (rev 100168)
@@ -23,6 +23,7 @@
#include <mono/metadata/metadata-internals.h>
#include <mono/metadata/rawbuffer.h>
#include <mono/metadata/class-internals.h>
+#include <mono/metadata/verify-internals.h>
#include "mono/utils/mono-digest.h"

gboolean dump_data = TRUE;
@@ -351,6 +352,8 @@
if (flags & (MONO_VERIFY_ALL + 1)) { /* verify code */
int i;
MonoTableInfo *m = &image->tables [MONO_TABLE_METHOD];
+
+ mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE);

for (i = 0; i < m->rows; ++i) {
MonoMethod *method;
@@ -360,6 +363,7 @@
char *sig;
MonoClass *klass = mono_method_get_class (method);
sig = mono_signature_get_desc (mono_method_signature (method), FALSE);
+ //FIXME report the class name taking nesting into account
g_print ("In method: %s.%s::%s(%s)\n", mono_class_get_namespace (klass), mono_class_get_name (klass), mono_method_get_name (method), sig);
g_free (sig);
}
@@ -388,7 +392,7 @@
static void
usage (void)
{
- printf ("Usage is: pedump [--verify error,warn,cls,all,code] file.exe\n");
+ printf ("Usage is: pedump [--verify error,warn,cls,all,code,fail-on-verifiable,non-strict] file.exe\n");
exit (1);
}

Modified: trunk/mono/mono/metadata/verify-internals.h
===================================================================
--- trunk/mono/mono/metadata/verify-internals.h 2008-04-08 22:47:55 UTC (rev 100167)
+++ trunk/mono/mono/metadata/verify-internals.h 2008-04-08 22:55:51 UTC (rev 100168)
@@ -21,6 +21,8 @@
gboolean mono_verifier_is_method_full_trust (MonoMethod *method) MONO_INTERNAL;
gboolean mono_verifier_is_class_full_trust (MonoClass *klass) MONO_INTERNAL;

+gboolean mono_verifier_verify_class (MonoClass *klass) MONO_INTERNAL;
+
GSList* mono_method_verify_with_current_settings (MonoMethod *method, gboolean skip_visibility) MONO_INTERNAL;
G_END_DECLS

Modified: trunk/mono/mono/metadata/verify.c
===================================================================
--- trunk/mono/mono/metadata/verify.c 2008-04-08 22:47:55 UTC (rev 100167)
+++ trunk/mono/mono/metadata/verify.c 2008-04-08 22:55:51 UTC (rev 100168)
@@ -5219,3 +5219,31 @@
| (!mono_verifier_is_method_full_trust (method) ? MONO_VERIFY_FAIL_FAST : 0)
| (skip_visibility ? MONO_VERIFY_SKIP_VISIBILITY : 0));
}
+
+
+gboolean
+mono_verifier_verify_class (MonoClass *class)
+{
+ int i, j, align;
+ if (!(class->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT || !class->has_references)
+ return TRUE;
+
+ //we must check for stuff overlapping reference fields
+ for (i = 0; i < class->field.count; ++i) {
+ MonoClassField *field = &class->fields [i];
+ int fieldEnd = field->offset + mono_type_size (field->type, &align);
+ gboolean is_valuetype = !MONO_TYPE_IS_REFERENCE (field->type);
+ if (mono_field_is_deleted (field))
+ continue;
+
+ for (j = i + 1; j < class->field.count; ++j) {
+ MonoClassField *other = &class->fields [j];
+ int otherEnd = other->offset + mono_type_size (other->type, &align);
+ if (mono_field_is_deleted (other) || (is_valuetype && !MONO_TYPE_IS_REFERENCE (other->type)))
+ continue;
+ if ((otherEnd > field->offset && otherEnd <= fieldEnd) || (other->offset >= field->offset && other->offset < fieldEnd))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}

Reply all
Reply to author
Forward
0 new messages