Переполнение WCHAR при выполнении wcscpy_s

При попытке получить массивный путь к папке из почтового ящика outlook (без максимальной длины пути 255 символов) я, похоже, не справляюсь с этим правильно, но все же я попробовал все в коде, и ничто не может пролить свет на проблему.

Path:        \\Mailbox - long\Inbox\fgsegesgrgesrgegthtrhrthyerytyertytthgfhgdfhdfh\sfhsjkdfhsjkhfweuifhskjefhjksdhjsdhfusehfklahdfajkehwfuasdf\sadfhjaehjfhaeufhuaseh9oa3heufhshudhjksahdfjkshadmldhasnf\awefuyawefioaw3yfiuapgpapwqq0uwqfeiusdfsgpsadncabpaw\iawehfiowaeghuiaegfwuioaghpaweufrhasdfhlkasvjdhlaehfuawieghgawgwaef\fasbclajsbvbwaubhvwabveuabvdjklzbdvjkhzusefhzlhsdf\vshiuwhpqphdfhvjsamhashmasdfvhnakjdsfiawjeijfvsadkjfsa\aefrghjksadfhjklshareuhsadhsahvsandvnlsdffalsdfh384fhsduafhl\fasfdlashjklefrhuaehfskhaahsdfhuhaiyeifoa38fodasfhsahdfklkkasdf\jkfhsakdfjhsjkladfhdsjkahfjkajkflashdfjkshafjksahfsdjafhsdjahfjsahldfkasf\fauiwehfeawhfjkhsakjfhsjkaefheuifhjksdhjkafhjksadhfjhaseuhfasjhdjkfhasfjhaskjdfhslaf\jklshadjkfhasjkhfjkaheuyhruiyq3y83yuryvnzxcvxzcviouxzcvzxvklzxvkl
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)

2 ответа

Решение
(n-80) * sizeof(WCHAR). 

Это копирует 160 символов в массиве длиной 100 символов. Kaboom.

Вы хотите считать символы, а не байты. удалять * sizeof(WCHAR), И вы должны проверить суррогатное.

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

Здесь второй аргумент должен быть размером буфера.

Другие вопросы по тегам