Module: wine Branch: master Commit: 5bdcd79c2e6ff00e0aeb0e9fd7d72919e60a7be8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5bdcd79c2e6ff00e0aeb0e9fd7...
Author: Andrew Nguyen anguyen@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