Merge pull request #901 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mono / metadata / sgen-los.c
index b273a5ab822bd0cf5f35c3a3590f6c5836723fff..ca4aaebbadfacd40e4d66c34f612affbf135dd5e 100644 (file)
@@ -334,6 +334,16 @@ sgen_los_alloc_large_inner (MonoVTable *vtable, size_t size)
        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);
@@ -510,10 +520,10 @@ mono_sgen_los_describe_pointer (char *ptr)
                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;
@@ -568,7 +578,11 @@ sgen_los_object_size (LOSObject *obj)
 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