2011-11-07 104 views
0

當試圖從Outlook郵箱(沒有255最大長度的字符在路徑中)檢索一個海量文件夾路徑我似乎沒有被正確處理,但我已經嘗試了代碼上的一切,什麼也沒有似乎在這個問題上發出了一些亮光。WCHAR溢出時執行wcscpy_s

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) 

回答

3
(n-80) * sizeof(WCHAR). 

在100個字符長的數組中複製160個字符。 KABOOM。

你想計算字符,而不是字節。刪除* sizeof(WCHAR)。你應該檢查一下代孕。

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

這裏的第二個參數被認爲是在緩衝區的大小。