oleview: Use standard APIs in SaveIdl and avoid overflows.

This commit is contained in:
Alexandre Julliard 2007-03-13 21:17:03 +01:00
parent ea8e860903
commit f0ddaedc29

View File

@ -117,8 +117,9 @@ static void SaveIdl(WCHAR *wszFileName)
HTREEITEM hIDL; HTREEITEM hIDL;
TVITEM tvi; TVITEM tvi;
HANDLE hFile; HANDLE hFile;
DWORD dwNumWrite; DWORD len, dwNumWrite;
char *wszIdl; char *wszIdl;
TYPELIB_DATA *data;
hIDL = TreeView_GetChild(typelib.hTree, TVI_ROOT); hIDL = TreeView_GetChild(typelib.hTree, TVI_ROOT);
@ -126,31 +127,24 @@ static void SaveIdl(WCHAR *wszFileName)
tvi.hItem = hIDL; tvi.hItem = hIDL;
SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi); SendMessage(typelib.hTree, TVM_GETITEM, 0, (LPARAM)&tvi);
data = (TYPELIB_DATA *)tvi.lParam;
hFile = CreateFile(wszFileName, GENERIC_WRITE, FILE_SHARE_WRITE, hFile = CreateFile(wszFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE) if(hFile == INVALID_HANDLE_VALUE)
{ {
ShowLastError(); ShowLastError();
return; return;
} }
wszIdl = HeapAlloc(GetProcessHeap(), 0, len = WideCharToMultiByte( CP_UTF8, 0, data->idl, data->idlLen, NULL, 0, NULL, NULL );
sizeof(WCHAR)*((TYPELIB_DATA *)(tvi.lParam))->idlLen); wszIdl = HeapAlloc(GetProcessHeap(), 0, len);
wine_utf8_wcstombs(((TYPELIB_DATA *)(tvi.lParam))->idl, WideCharToMultiByte( CP_UTF8, 0, data->idl, data->idlLen, wszIdl, len, NULL, NULL );
((TYPELIB_DATA *)(tvi.lParam))->idlLen, wszIdl,
((TYPELIB_DATA *)(tvi.lParam))->idlLen);
if(!WriteFile(hFile, wszIdl, ((TYPELIB_DATA *)(tvi.lParam))->idlLen, if(!WriteFile(hFile, wszIdl, len, &dwNumWrite, NULL))
&dwNumWrite, NULL))
{
ShowLastError(); ShowLastError();
HeapFree(GetProcessHeap(), 0, wszIdl);
return;
}
HeapFree(GetProcessHeap(), 0, wszIdl); HeapFree(GetProcessHeap(), 0, wszIdl);
SetEndOfFile(hFile);
CloseHandle(hFile); CloseHandle(hFile);
} }