Module: wine Branch: master Commit: e52531ab1dae0e1edeb5787b545693ae5db0fd23 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e52531ab1dae0e1edeb5787b54...
Author: Hans Leidekker hans@codeweavers.com Date: Fri Nov 13 11:06:12 2009 +0100
msi: Handle environment strings without a value.
---
dlls/msi/action.c | 39 +++++++++++++++++++++++---------------- dlls/msi/tests/install.c | 10 +++++++++- 2 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index a6af7cc..3a11c61 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -4888,7 +4888,6 @@ static UINT ACTION_InstallODBC( MSIPACKAGE *package ) static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags ) { LPCWSTR cptr = *name; - LPCWSTR ptr = *value;
static const WCHAR prefix[] = {'[','~',']',0}; static const int prefix_len = 3; @@ -4919,18 +4918,22 @@ static LONG env_set_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags ) return ERROR_FUNCTION_FAILED; }
- if (!strncmpW(ptr, prefix, prefix_len)) + if (*value) { - *flags |= ENV_MOD_APPEND; - *value += lstrlenW(prefix); - } - else if (lstrlenW(*value) >= prefix_len) - { - ptr += lstrlenW(ptr) - prefix_len; - if (!lstrcmpW(ptr, prefix)) + LPCWSTR ptr = *value; + if (!strncmpW(ptr, prefix, prefix_len)) { - *flags |= ENV_MOD_PREFIX; - /* the "[~]" will be removed by deformat_string */; + *flags |= ENV_MOD_APPEND; + *value += lstrlenW(prefix); + } + else if (lstrlenW(*value) >= prefix_len) + { + ptr += lstrlenW(ptr) - prefix_len; + if (!lstrcmpW(ptr, prefix)) + { + *flags |= ENV_MOD_PREFIX; + /* the "[~]" will be removed by deformat_string */; + } } }
@@ -4978,8 +4981,7 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) if (res != ERROR_SUCCESS) goto done;
- deformat_string(package, value, &deformatted); - if (!deformatted) + if (value && !deformat_string(package, value, &deformatted)) { res = ERROR_OUTOFMEMORY; goto done; @@ -5066,7 +5068,7 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) } } } - else + else if (value) { size = (lstrlenW(value) + 1) * sizeof(WCHAR); newval = msi_alloc(size); @@ -5079,8 +5081,13 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) lstrcpyW(newval, value); }
- TRACE("setting %s to %s\n", debugstr_w(name), debugstr_w(newval)); - res = RegSetValueExW(env, name, 0, type, (LPVOID)newval, size); + if (newval) + { + TRACE("setting %s to %s\n", debugstr_w(name), debugstr_w(newval)); + res = RegSetValueExW(env, name, 0, type, (LPVOID)newval, size); + } + else + res = ERROR_SUCCESS;
done: if (env) RegCloseKey(env); diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 6efd290..35bbc85 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -174,7 +174,9 @@ static const CHAR environment_dat[] = "Environment\tName\tValue\tComponent_\n" "Var1\t=-MSITESTVAR1\t1\tOne\n" "Var2\tMSITESTVAR2\t1\tOne\n" "Var3\t=-MSITESTVAR3\t1\tOne\n" - "Var4\tMSITESTVAR4\t1\tOne\n"; + "Var4\tMSITESTVAR4\t1\tOne\n" + "Var5\t-MSITESTVAR5\t\tOne\n" + "Var6\tMSITESTVAR6\t\tOne\n";
static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n" "s38\ti2\tS255\n" @@ -6610,6 +6612,12 @@ static void test_envvar(void) res = RegDeleteValueA(env, "MSITESTVAR4"); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+ res = RegDeleteValueA(env, "MSITESTVAR5"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR6"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + RegCloseKey(env);
delete_pf("msitest\cabout\new\five.txt", TRUE);