LDARG_0

.........

MS .Net的一个BUG?

.Net V4下面的Buffer类封装了这么一个方法,如果留意注释部分,可以发现这一句不仅导致没有复制正确的数据,而且有可能溢出。

正确的写法应该是将这两行代码调整到下一行。

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), ForceTokenStabilization, SecurityCritical]
internal static unsafe void memcpyimpl(byte* src, byte* dest, int len)
{
    if (len >= 0x10)
    {
        do
        {
            *((int*) dest) = *((int*) src);
            *((int*) (dest + 4)) = *((int*) (src + 4));
            *((int*) (dest + 8)) = *((int*) (src + 8));
            *((int*) (dest + 12)) = *((int*) (src + 12));
            dest += 0x10;
            src += 0x10;
        }
        while ((len -= 0x10) >= 0x10);
    }
    if (len > 0)
    {
        if ((len & 8) != 0)
        {
            *((int*) dest) = *((int*) src);
            *((int*) (dest + 4)) = *((int*) (src + 4));
            dest += 8;
            src += 8;
        }
        if ((len & 4) != 0)
        {
            *((int*) dest) = *((int*) src);
            dest += 4;
            src += 4;
        }
        if ((len & 2) != 0)
        {
            *((short*) dest) = *((short*) src);
            dest += 2;
            src += 2;
        }
        if ((len & 1) != 0)
        {
            dest++;//需要调整
            src++;//需要调整
            dest[0] = src[0];
        }
    }
}

 

  

posted on 2011-11-09 21:41  sumok  阅读(1114)  评论(2编辑  收藏  举报

导航