[runtime] Use MONO_SIZEOF_TYPE instead of sizeof (MonoType) and compiler generated...
authorRodrigo Kumpera <kumpera@gmail.com>
Wed, 29 Jul 2015 16:04:37 +0000 (12:04 -0400)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 29 Jul 2015 16:07:35 +0000 (12:07 -0400)
On amd64 MONO_SIZEOF_TYPE is 12 and sizeof(MonoType) is 16. This leads to memory corruption
if one uses sizeof instead of the specific size.

This is one of those oddball behaviors of the runtime that makes easy things very hard. :(

mono/metadata/metadata.c

index 7927ba9be92bda3095c4336504445fa2e948118b..b332bd6e99dbba2aac094e39770a0b244e32774c 100644 (file)
@@ -1864,7 +1864,7 @@ mono_metadata_signature_dup_internal_with_padding (MonoImage *image, MonoMemPool
        MonoMethodSignature *ret;
        sigsize = sig_header_size = MONO_SIZEOF_METHOD_SIGNATURE + sig->param_count * sizeof (MonoType *) + padding;
        if (sig->ret)
-               sigsize += sizeof (MonoType);
+               sigsize += MONO_SIZEOF_TYPE;
 
        if (image) {
                ret = mono_image_alloc (image, sigsize);
@@ -1881,7 +1881,7 @@ mono_metadata_signature_dup_internal_with_padding (MonoImage *image, MonoMemPool
                // Danger! Do not alter padding use without changing the dup_add_this below
                intptr_t end_of_header = (intptr_t)( (char*)(ret) + sig_header_size);
                ret->ret = (MonoType *)end_of_header;
-               *ret->ret = *sig->ret;
+               memcpy (ret->ret, sig->ret, MONO_SIZEOF_TYPE);
        }
 
        return ret;