X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-los.c;h=ca4aaebbadfacd40e4d66c34f612affbf135dd5e;hb=a0173a7e76ad48889ade46116e516731b170e7c5;hp=b273a5ab822bd0cf5f35c3a3590f6c5836723fff;hpb=3f3ef7225cbabdae584723e5d77974d2e1c67d6c;p=mono.git diff --git a/mono/metadata/sgen-los.c b/mono/metadata/sgen-los.c index b273a5ab822..ca4aaebbadf 100644 --- a/mono/metadata/sgen-los.c +++ b/mono/metadata/sgen-los.c @@ -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