2011-11-07 2 views
0

Lorsque vous essayez de récupérer un chemin de dossier massif à partir d'une boîte aux lettres Outlook (pas de 255 caractères max longueur dans le chemin) Je ne semble pas être le gérer correctement, mais j'ai tout essayé sur le code et rien semble faire la lumière sur la question.Débordement WCHAR lors de l'exécution de wcscpy_s

Path:  \\Mailbox - long\Inbox\fgsegesgrgesrgegthtrhrthyerytyertytthgfhgdfhdfh\sfhsjkdfhsjkhfweuifhskjefhjksdhjsdhfusehfklahdfajkehwfuasdf\sadfhjaehjfhaeufhuaseh9oa3heufhshudhjksahdfjkshadmldhasnf\awefuyawefioaw3yfiuapgpapwqq0uwqfeiusdfsgpsadncabpaw\iawehfiowaeghuiaegfwuioaghpaweufrhasdfhlkasvjdhlaehfuawieghgawgwaef\fasbclajsbvbwaubhvwabveuabvdjklzbdvjkhzusefhzlhsdf\vshiuwhpqphdfhvjsamhashmasdfvhnakjdsfiawjeijfvsadkjfsa\aefrghjksadfhjklshareuhsadhsahvsandvnlsdffalsdfh384fhsduafhl\fasfdlashjklefrhuaehfskhaahsdfhuhaiyeifoa38fodasfhsahdfklkkasdf\jkfhsakdfjhsjkladfhdsjkahfjkajkflashdfjkshafjksahfsdjafhsdjahfjsahldfkasf\fauiwehfeawhfjkhsakjfhsjkaefheuifhjksdhjkafhjksadhfjhaseuhfasjhdjkfhasfjhaskjdfhslaf\jklshadjkfhasjkhfjkaheuyhruiyq3y83yuryvnzxcvxzcviouxzcvzxvklzxvkl 
Path Length: 766 to 812 char 

En espérant mieux l'expliquer un peu mieux, le code;

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 *** 
    } 
} 
... 

L'erreur fatale occurrs à string.h ligne;

__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(errno_t, wcscpy_s, wchar_t, _Dest, _In_z_ const wchar_t *, _Source) 

Répondre

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

Copie 160 caractères dans un tableau de 100 caractères. Kaboom.

Vous souhaitez compter les caractères, pas les octets. Supprimez * sizeof(WCHAR). Et vous devriez vérifier pour un substitut.

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

Ici, le second argument est censé être la taille de la mémoire tampon.

Questions connexes