g_assert (size > SGEN_MAX_SMALL_OBJ_SIZE);
g_assert ((size & 1) == 0);
+ /*
+ * size + sizeof (LOSObject) <= SIZE_MAX - (mono_pagesize () - 1)
+ *
+ * therefore:
+ *
+ * size <= SIZE_MAX - (mono_pagesize () - 1) - sizeof (LOSObject)
+ */
+ if (size > SIZE_MAX - (mono_pagesize () - 1) - sizeof (LOSObject))
+ return NULL;
+
#ifdef LOS_DUMMY
if (!los_segment)
los_segment = sgen_alloc_os_memory (LOS_SEGMENT_SIZE, SGEN_ALLOC_HEAP | SGEN_ALLOC_ACTIVATE, NULL);
vtable = (MonoVTable*)SGEN_LOAD_VTABLE (obj->data);
if (obj->data == ptr) {
- SGEN_LOG (0, "%s (size %td pin %d)\n", los_kind, size, pinned ? 1 : 0);
+ SGEN_LOG (0, "%s (size %d pin %d)\n", los_kind, (int)size, pinned ? 1 : 0);
} else {
- SGEN_LOG (0, "%s (interior-ptr offset %td size %td pin %d)",
- los_kind, ptr - obj->data, size, pinned ? 1 : 0);
+ SGEN_LOG (0, "%s (interior-ptr offset %td size %d pin %d)",
+ los_kind, ptr - obj->data, (int)size, pinned ? 1 : 0);
}
return TRUE;
LOSObject*
sgen_los_header_for_object (char *data)
{
+#if _MSC_VER
+ return (LOSObject*)(data - (int)(&(((LOSObject*)0)->data)));
+#else
return (LOSObject*)(data - sizeof (LOSObject));
+#endif
}
void