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