Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56134
-- v5: msvcrt/tests: Test case insensitivity of getenv() and _wgetenv() msvcrt: Compare environmental variable names case insensitively
From: Zsolt Vadasz zsolt_vadasz@protonmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56134 --- dlls/msvcrt/environ.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c index 063a9254c67..aa857afa615 100644 --- a/dlls/msvcrt/environ.c +++ b/dlls/msvcrt/environ.c @@ -125,7 +125,7 @@ static int env_get_index(const char *name) len = strlen(name); for (i = 0; MSVCRT__environ[i]; i++) { - if (!strncmp(name, MSVCRT__environ[i], len) && MSVCRT__environ[i][len] == '=') + if (!strnicmp(name, MSVCRT__environ[i], len) && MSVCRT__environ[i][len] == '=') return i; } return i; @@ -138,7 +138,7 @@ static int wenv_get_index(const wchar_t *name) len = wcslen(name); for (i = 0; MSVCRT__wenviron[i]; i++) { - if (!wcsncmp(name, MSVCRT__wenviron[i], len) && MSVCRT__wenviron[i][len] == '=') + if (!wcsnicmp(name, MSVCRT__wenviron[i], len) && MSVCRT__wenviron[i][len] == '=') return i; } return i;
From: Zsolt Vadasz zsolt_vadasz@protonmail.com
--- dlls/msvcrt/tests/environ.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/dlls/msvcrt/tests/environ.c b/dlls/msvcrt/tests/environ.c index aab14a422b3..711f91abd99 100644 --- a/dlls/msvcrt/tests/environ.c +++ b/dlls/msvcrt/tests/environ.c @@ -421,6 +421,29 @@ static void test_child_env(char** argv) free( env ); }
+static void test_case_insensitive(void) +{ + const char *uppercase_env = getenv("APPDATA"); + const char *lowercase_env = getenv("appdata"); + const wchar_t *uppercase_wenv = _wgetenv(L"APPDATA"); + const wchar_t *lowercase_wenv = _wgetenv(L"appdata"); + + ok( uppercase_env == lowercase_env, "getenv() must be case insensitive, %p should be %p\n", + lowercase_env, uppercase_env ); + ok( uppercase_wenv == lowercase_wenv, "_wgetenv() must be case insensitive, %p should be %p\n", + lowercase_wenv, uppercase_wenv ); + + ok( !_putenv("cAt=bar"), "Failed to set CAT=bar\n" ); + ok( !_putenv("CAT=BAR"), "Failed to set CAT=BAR\n" ); + ok( !strcmp(getenv("cAt"), "BAR"), "_putenv() must be case insensitive\n" ); + + ok( !_wputenv(L"cAt=bar"), "Failed to set CAT=bar\n" ); + ok( !p_wputenv_s(L"CAT", L"BAR"), "Failed to set CAT=BAR\n" ); + ok( !wcscmp(_wgetenv(L"cAt"), L"BAR"), "_wputenv() must be case insensitive\n" ); + + _putenv("cat="); +} + START_TEST(environ) { char **argv; @@ -443,4 +466,5 @@ START_TEST(environ) test_environment_manipulation(); test_child_env(argv); test_system(); + test_case_insensitive(); }
Piotr Caban (@piotr) commented about dlls/msvcrt/tests/environ.c:
- const char *uppercase_env = getenv("APPDATA");
- const char *lowercase_env = getenv("appdata");
- const wchar_t *uppercase_wenv = _wgetenv(L"APPDATA");
- const wchar_t *lowercase_wenv = _wgetenv(L"appdata");
- ok( uppercase_env == lowercase_env, "getenv() must be case insensitive, %p should be %p\n",
lowercase_env, uppercase_env );
- ok( uppercase_wenv == lowercase_wenv, "_wgetenv() must be case insensitive, %p should be %p\n",
lowercase_wenv, uppercase_wenv );
- ok( !_putenv("cAt=bar"), "Failed to set CAT=bar\n" );
- ok( !_putenv("CAT=BAR"), "Failed to set CAT=BAR\n" );
- ok( !strcmp(getenv("cAt"), "BAR"), "_putenv() must be case insensitive\n" );
- ok( !_wputenv(L"cAt=bar"), "Failed to set CAT=bar\n" );
- ok( !p_wputenv_s(L"CAT", L"BAR"), "Failed to set CAT=BAR\n" );
Other tests that use `p_wputenv_s` are checking if the function is available. Please use `_wputenv` instead or ski[p the test if `p_wputenv_s == NULL`.