Andrew Nguyen : shdocvw: Correct misuse of output pointer in get_profile_string helper.
Alexandre Julliard
julliard at winehq.org
Tue Dec 7 10:59:31 CST 2010
Module: wine
Branch: master
Commit: 5bdcd79c2e6ff00e0aeb0e9fd7d72919e60a7be8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5bdcd79c2e6ff00e0aeb0e9fd7d72919e60a7be8
Author: Andrew Nguyen <anguyen at codeweavers.com>
Date: Tue Dec 7 03:13:02 2010 -0600
shdocvw: Correct misuse of output pointer in get_profile_string helper.
---
dlls/shdocvw/intshcut.c | 41 +++++++++++++++++++++++++----------------
1 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/dlls/shdocvw/intshcut.c b/dlls/shdocvw/intshcut.c
index e209e04..c82d1c2 100644
--- a/dlls/shdocvw/intshcut.c
+++ b/dlls/shdocvw/intshcut.c
@@ -416,23 +416,32 @@ static DWORD get_profile_string(LPCWSTR lpAppName, LPCWSTR lpKeyName,
LPCWSTR lpFileName, WCHAR **rString )
{
DWORD r = 0;
- DWORD len=128;
+ DWORD len = 128;
+ WCHAR *buffer;
- *rString = CoTaskMemAlloc(len*sizeof(WCHAR));
- if (rString != NULL)
+ buffer = CoTaskMemAlloc(len * sizeof(*buffer));
+ if (buffer != NULL)
{
- r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, *rString, len, lpFileName);
+ r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
while (r == len-1)
{
- CoTaskMemFree(rString);
+ WCHAR *realloc_buf;
+
len *= 2;
- rString = CoTaskMemAlloc(len*sizeof(WCHAR));
- if (rString == NULL)
- break;
- r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, *rString, len, lpFileName);
+ realloc_buf = CoTaskMemRealloc(buffer, len * sizeof(*buffer));
+ if (realloc_buf == NULL)
+ {
+ CoTaskMemFree(buffer);
+ *rString = NULL;
+ return 0;
+ }
+ buffer = realloc_buf;
+
+ r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
}
}
+ *rString = buffer;
return r;
}
@@ -456,12 +465,17 @@ static HRESULT WINAPI PersistFile_Load(IPersistFile *pFile, LPCOLESTR pszFileNam
r = get_profile_string(str_header, str_URL, pszFileName, &url);
- if (r == 0)
+ if (url == NULL)
+ {
+ hr = E_OUTOFMEMORY;
+ CoTaskMemFree(filename);
+ }
+ else if (r == 0)
{
hr = E_FAIL;
CoTaskMemFree(filename);
}
- else if (url != NULL)
+ else
{
hr = S_OK;
CoTaskMemFree(This->currentFile);
@@ -470,11 +484,6 @@ static HRESULT WINAPI PersistFile_Load(IPersistFile *pFile, LPCOLESTR pszFileNam
This->url = url;
This->isDirty = FALSE;
}
- else
- {
- hr = E_OUTOFMEMORY;
- CoTaskMemFree(filename);
- }
/* Now we're going to read in the iconfile and iconindex.
If we don't find them, that's not a failure case -- it's possible
More information about the wine-cvs
mailing list