James Hawkins : msi: Simplify ITERATE_WriteEnvironmentString.

Alexandre Julliard julliard at winehq.org
Wed Dec 16 09:41:33 CST 2009


Module: wine
Branch: master
Commit: 1b7238a96983659c23eb5b35322d1427fedd6796
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1b7238a96983659c23eb5b35322d1427fedd6796

Author: James Hawkins <truiken at gmail.com>
Date:   Tue Dec 15 18:19:19 2009 -0800

msi: Simplify ITERATE_WriteEnvironmentString.

Now we only allocate enough memory to exactly match the size of the
constructed string. Before, we were leaving some memory uninitialized
and overwriting the allocated memory in certain circum.

---

 dlls/msi/action.c |   68 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index ef30dda..a5c916e 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -5013,7 +5013,24 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
         (res == ERROR_SUCCESS && type != REG_SZ && type != REG_EXPAND_SZ))
         goto done;
 
-    if (res != ERROR_FILE_NOT_FOUND)
+    if ((res == ERROR_FILE_NOT_FOUND || !(flags & ENV_MOD_MASK)))
+    {
+        /* Nothing to do. */
+        if (!value)
+        {
+            res = ERROR_SUCCESS;
+            goto done;
+        }
+
+        size = (lstrlenW(value) + 1) * sizeof(WCHAR);
+        newval = strdupW(value);
+        if (!newval)
+        {
+            res = ERROR_OUTOFMEMORY;
+            goto done;
+        }
+    }
+    else
     {
         if (flags & ENV_ACT_SETABSENT)
         {
@@ -5038,8 +5055,18 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
             goto done;
         }
 
-        size += (lstrlenW(value) + 1) * sizeof(WCHAR);
-        newval =  msi_alloc(size);
+        size = (lstrlenW(data) + 1) * sizeof(WCHAR);
+        if (flags & ENV_MOD_MASK)
+        {
+            DWORD mod_size;
+            int multiplier = 0;
+            if (flags & ENV_MOD_APPEND) multiplier++;
+            if (flags & ENV_MOD_PREFIX) multiplier++;
+            mod_size = (lstrlenW(value) + 1) * multiplier;
+            size += mod_size * sizeof(WCHAR);
+        }
+
+        newval = msi_alloc(size);
         ptr = newval;
         if (!newval)
         {
@@ -5047,37 +5074,20 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
             goto done;
         }
 
-        if (!(flags & ENV_MOD_MASK))
-            lstrcpyW(newval, value);
-        else
+        if (flags & ENV_MOD_PREFIX)
         {
-            if (flags & ENV_MOD_PREFIX)
-            {
-                lstrcpyW(newval, value);
-                lstrcatW(newval, szSemiColon);
-                ptr = newval + lstrlenW(value) + 1;
-            }
+            lstrcpyW(newval, value);
+            lstrcatW(newval, szSemiColon);
+            ptr = newval + lstrlenW(value) + 1;
+        }
 
-            lstrcpyW(ptr, data);
+        lstrcpyW(ptr, data);
 
-            if (flags & ENV_MOD_APPEND)
-            {
-                lstrcatW(newval, szSemiColon);
-                lstrcatW(newval, value);
-            }
-        }
-    }
-    else if (value)
-    {
-        size = (lstrlenW(value) + 1) * sizeof(WCHAR);
-        newval = msi_alloc(size);
-        if (!newval)
+        if (flags & ENV_MOD_APPEND)
         {
-            res = ERROR_OUTOFMEMORY;
-            goto done;
+            lstrcatW(newval, szSemiColon);
+            lstrcatW(newval, value);
         }
-
-        lstrcpyW(newval, value);
     }
 
     if (newval)




More information about the wine-cvs mailing list