Skip to content

Commit 1995e5b

Browse files
committed
Enable detection for overlapping reference and non-reference fields
1 parent 5fddd4e commit 1995e5b

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

mono/metadata/class.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -2008,7 +2008,6 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
20082008
}
20092009
break;
20102010
case TYPE_ATTRIBUTE_EXPLICIT_LAYOUT: {
2011-
guint8 *ref_bitmap;
20122011

20132012
real_size = 0;
20142013
for (i = 0; i < top; i++) {
@@ -2054,8 +2053,9 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
20542053
real_size = MAX (real_size, size + field_offsets [i]);
20552054
}
20562055

2057-
if (klass->has_references) {
2058-
ref_bitmap = g_new0 (guint8, real_size / sizeof (gpointer));
2056+
if (has_references) {
2057+
MonoType **ref_bitmap;
2058+
ref_bitmap = g_new0 (MonoType*, real_size / sizeof (gpointer));
20592059

20602060
/* Check for overlapping reference and non-reference fields */
20612061
for (i = 0; i < top; i++) {
@@ -2069,7 +2069,7 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
20692069
continue;
20702070
ftype = mono_type_get_underlying_type (field->type);
20712071
if (MONO_TYPE_IS_REFERENCE (ftype))
2072-
ref_bitmap [field_offsets [i] / sizeof (gpointer)] = 1;
2072+
ref_bitmap [field_offsets [i] / sizeof (gpointer)] = ftype;
20732073
}
20742074
for (i = 0; i < top; i++) {
20752075
field = &klass->fields [i];
@@ -2080,8 +2080,8 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
20802080
continue;
20812081

20822082
// FIXME: Too much code does this
2083-
#if 0
2084-
if (!MONO_TYPE_IS_REFERENCE (field->type) && ref_bitmap [field_offsets [i] / sizeof (gpointer)]) {
2083+
#if 1
2084+
if (!MONO_TYPE_IS_REFERENCE (field->type) && ref_bitmap[field_offsets[i] / sizeof (gpointer)] && !mono_metadata_type_equal(field->type, ref_bitmap [field_offsets [i] / sizeof (gpointer)])) {
20852085
mono_class_set_type_load_failure (klass, "Could not load type '%s' because it contains an object field at offset %d that is incorrectly aligned or overlapped by a non-object field.", klass->name, field_offsets [i]);
20862086
}
20872087
#endif

0 commit comments

Comments
 (0)