oleaut32: Rewrite MSFT_ReadName and MSFT_ReadString to need one less allocation and to fix a memory leak.

This commit is contained in:
Rob Shearman 2006-10-23 11:39:43 +01:00 committed by Alexandre Julliard
parent b3d024a7bb
commit b5c78d0dff

View File

@ -1511,7 +1511,6 @@ static BSTR MSFT_ReadName( TLBContext *pcx, int offset)
char * name; char * name;
MSFT_NameIntro niName; MSFT_NameIntro niName;
int lengthInChars; int lengthInChars;
WCHAR* pwstring = NULL;
BSTR bstrName = NULL; BSTR bstrName = NULL;
if (offset < 0) if (offset < 0)
@ -1532,15 +1531,12 @@ static BSTR MSFT_ReadName( TLBContext *pcx, int offset)
/* no invalid characters in string */ /* no invalid characters in string */
if (lengthInChars) if (lengthInChars)
{ {
pwstring = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*lengthInChars); bstrName = SysAllocStringByteLen(NULL, lengthInChars * sizeof(WCHAR));
/* don't check for invalid character since this has been done previously */ /* don't check for invalid character since this has been done previously */
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, pwstring, lengthInChars); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, bstrName, lengthInChars);
bstrName = SysAllocStringLen(pwstring, lengthInChars);
lengthInChars = SysStringLen(bstrName);
HeapFree(GetProcessHeap(), 0, pwstring);
} }
TLB_Free(name);
TRACE_(typelib)("%s %d\n", debugstr_w(bstrName), lengthInChars); TRACE_(typelib)("%s %d\n", debugstr_w(bstrName), lengthInChars);
return bstrName; return bstrName;
@ -1566,15 +1562,12 @@ static BSTR MSFT_ReadString( TLBContext *pcx, int offset)
/* no invalid characters in string */ /* no invalid characters in string */
if (lengthInChars) if (lengthInChars)
{ {
WCHAR* pwstring = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*lengthInChars); bstr = SysAllocStringByteLen(NULL, lengthInChars * sizeof(WCHAR));
/* don't check for invalid character since this has been done previously */ /* don't check for invalid character since this has been done previously */
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, string, -1, pwstring, lengthInChars); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, string, -1, bstr, lengthInChars);
bstr = SysAllocStringLen(pwstring, lengthInChars);
lengthInChars = SysStringLen(bstr);
HeapFree(GetProcessHeap(), 0, pwstring);
} }
TLB_Free(string);
TRACE_(typelib)("%s %d\n", debugstr_w(bstr), lengthInChars); TRACE_(typelib)("%s %d\n", debugstr_w(bstr), lengthInChars);
return bstr; return bstr;