执行wcscpy_s时WCHAR溢出

WCHAR overflow when performing wcscpy_s

本文关键字:WCHAR 溢出 wcscpy 执行      更新时间:2023-10-16

当试图从outlook邮箱中检索一个巨大的文件夹路径(路径中没有255个字符的最大长度(时,我似乎没有正确处理它,但我已经尝试了代码中的所有内容,似乎没有什么能解决这个问题。

Path:        \Mailbox - longInboxfgsegesgrgesrgegthtrhrthyerytyertytthgfhgdfhdfhsfhsjkdfhsjkhfweuifhskjefhjksdhjsdhfusehfklahdfajkehwfuasdfsadfhjaehjfhaeufhuaseh9oa3heufhshudhjksahdfjkshadmldhasnfawefuyawefioaw3yfiuapgpapwqq0uwqfeiusdfsgpsadncabpawiawehfiowaeghuiaegfwuioaghpaweufrhasdfhlkasvjdhlaehfuawieghgawgwaeffasbclajsbvbwaubhvwabveuabvdjklzbdvjkhzusefhzlhsdfvshiuwhpqphdfhvjsamhashmasdfvhnakjdsfiawjeijfvsadkjfsaaefrghjksadfhjklshareuhsadhsahvsandvnlsdffalsdfh384fhsduafhlfasfdlashjklefrhuaehfskhaahsdfhuhaiyeifoa38fodasfhsahdfklkkasdfjkfhsakdfjhsjkladfhdsjkahfjkajkflashdfjkshafjksahfsdjafhsdjahfjsahldfkasffauiwehfeawhfjkhsakjfhsjkaefheuifhjksdhjkafhjksadhfjhaseuhfasjhdjkfhasfjhaskjdfhslafjklshadjkfhasjkhfjkaheuyhruiyq3y83yuryvnzxcvxzcviouxzcvzxvklzxvkl
Path Length: 766 to 812 char

希望能更好地解释一下代码;

if(....)
{
    size_t n = wcslen(outlookFolderPath->Value.lpszW);
    if(n < 100)
        wcscpy_s(m_szInheritedFolderPath, outlookFolderPath->Value.lpszW);
    else
    {
        WCHAR szTemp[2048] = {}, szText[2048]= {};
        LoadStringW(ghInstDLL, IDS_PATH_TRUNCATED, szText, 2048);
        swprintf_s(szTemp, szText, outlookFolderPath->Value.lpszW + ((n-80) * sizeof(WCHAR)));
        wcscpy_s(m_szInheritedFolderPath, szTemp);     // *** Dies Here ***
    }
} 
...

致命错误发生在string.h行;

__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(errno_t, wcscpy_s, wchar_t, _Dest, _In_z_ const wchar_t *, _Source)
(n-80) * sizeof(WCHAR). 

它在一个100个字符长的数组中复制160个字符。卡博姆。

您要计算的是字符数,而不是字节数。删除* sizeof(WCHAR)。你应该找个代孕者。

swprintf_s(szTemp, szText, outlookFolderPath->Value.lpszW + ((n-80) * sizeof(WCHAR)));

这里的第二个参数应该是缓冲区的大小。