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