Merge pull request #901 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mono / metadata / sgen-los.c
index dcf3907874c1c9ab0824a5d32b0047b97c33f848..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;
@@ -554,19 +564,8 @@ sgen_los_update_cardtable_mod_union (void)
        LOSObject *obj;
 
        for (obj = los_object_list; obj; obj = obj->next) {
-               guint8 *start_card = sgen_card_table_get_card_scan_address ((mword)obj->data);
-               guint8 *end_card = sgen_card_table_get_card_scan_address ((mword)obj->data + obj->size - 1) + 1;
-               size_t num_cards = end_card - start_card;
-
-               if (!obj->cardtable_mod_union) {
-                       obj->cardtable_mod_union = sgen_alloc_internal_dynamic (num_cards,
-                                       INTERNAL_MEM_CARDTABLE_MOD_UNION, TRUE);
-                       memcpy (obj->cardtable_mod_union, start_card, num_cards);
-               } else {
-                       int i;
-                       for (i = 0; i < num_cards; ++i)
-                               obj->cardtable_mod_union [i] |= start_card [i];
-               }
+               obj->cardtable_mod_union = sgen_card_table_update_mod_union (obj->cardtable_mod_union,
+                               obj->data, obj->size, NULL);
        }
 }
 
@@ -579,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