Skip to content

Commit 933d765

Browse files
committed
Enable detection for overlapping reference and non-reference fields
1 parent b73fd4a commit 933d765

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

mono/metadata/class.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,7 +2066,6 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
20662066
}
20672067
break;
20682068
case TYPE_ATTRIBUTE_EXPLICIT_LAYOUT: {
2069-
guint8 *ref_bitmap;
20702069

20712070
real_size = 0;
20722071
for (i = 0; i < top; i++) {
@@ -2112,8 +2111,9 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
21122111
real_size = MAX (real_size, size + field_offsets [i]);
21132112
}
21142113

2115-
if (klass->has_references) {
2116-
ref_bitmap = g_new0 (guint8, real_size / sizeof (gpointer));
2114+
if (has_references) {
2115+
MonoType **ref_bitmap;
2116+
ref_bitmap = g_new0 (MonoType*, real_size / sizeof (gpointer));
21172117

21182118
/* Check for overlapping reference and non-reference fields */
21192119
for (i = 0; i < top; i++) {
@@ -2127,7 +2127,7 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
21272127
continue;
21282128
ftype = mono_type_get_underlying_type (field->type);
21292129
if (MONO_TYPE_IS_REFERENCE (ftype))
2130-
ref_bitmap [field_offsets [i] / sizeof (gpointer)] = 1;
2130+
ref_bitmap [field_offsets [i] / sizeof (gpointer)] = ftype;
21312131
}
21322132
for (i = 0; i < top; i++) {
21332133
field = &klass->fields [i];
@@ -2138,8 +2138,8 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
21382138
continue;
21392139

21402140
// FIXME: Too much code does this
2141-
#if 0
2142-
if (!MONO_TYPE_IS_REFERENCE (field->type) && ref_bitmap [field_offsets [i] / sizeof (gpointer)]) {
2141+
#if 1
2142+
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)])) {
21432143
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]);
21442144
}
21452145
#endif

0 commit comments

Comments
 (0)