Vladimir Panteleev : kernelbase: Fix GetEnvironmentVariableW return for empty variables.
Alexandre Julliard
julliard at winehq.org
Fri May 15 16:55:06 CDT 2020
Module: wine
Branch: master
Commit: c4ef987429cef13bec1b7762bd70d99fee10670c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c4ef987429cef13bec1b7762bd70d99fee10670c
Author: Vladimir Panteleev <git at vladimir.panteleev.md>
Date: Thu May 14 23:12:26 2020 +0200
kernelbase: Fix GetEnvironmentVariableW return for empty variables.
Do the same thing as Vista and up.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48471
Signed-off-by: Vladimir Panteleev <git at vladimir.panteleev.md>
Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/environ.c | 20 ++++++++++++++++++++
dlls/kernelbase/process.c | 3 ++-
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/tests/environ.c b/dlls/kernel32/tests/environ.c
index 5de7980bca..3c1563a331 100644
--- a/dlls/kernel32/tests/environ.c
+++ b/dlls/kernel32/tests/environ.c
@@ -168,6 +168,16 @@ static void test_GetSetEnvironmentVariableA(void)
"%s should be set to \"\" (NT) or removed (Win9x) but ret_size=%d GetLastError=%d and buf=%s\n",
name, ret_size, GetLastError(), buf);
+ SetLastError(0xdeadbeef);
+ ret_size = GetEnvironmentVariableA(name, NULL, 0);
+ ok(ret_size == 1 ||
+ broken(ret_size == 0), /* XP */
+ "should return 1 for empty string but ret_size=%d GetLastError=%d\n",
+ ret_size, GetLastError());
+ ok(GetLastError() == 0xdeadbeef ||
+ broken(GetLastError() == ERROR_MORE_DATA), /* XP */
+ "should not fail with zero size but GetLastError=%d\n", GetLastError());
+
/* Test the limits */
SetLastError(0xdeadbeef);
ret_size = GetEnvironmentVariableA(NULL, NULL, 0);
@@ -277,6 +287,16 @@ static void test_GetSetEnvironmentVariableW(void)
ret_size, GetLastError());
ok(lstrcmpW(buf, empty_strW) == 0, "should copy an empty string\n");
+ SetLastError(0xdeadbeef);
+ ret_size = GetEnvironmentVariableW(name, NULL, 0);
+ ok(ret_size == 1 ||
+ broken(ret_size == 0), /* XP */
+ "should return 1 for empty string but ret_size=%d GetLastError=%d\n",
+ ret_size, GetLastError());
+ ok(GetLastError() == 0xdeadbeef ||
+ broken(GetLastError() == ERROR_MORE_DATA), /* XP */
+ "should not fail with zero size but GetLastError=%d\n", GetLastError());
+
/* Test the limits */
SetLastError(0xdeadbeef);
ret_size = GetEnvironmentVariableW(NULL, NULL, 0);
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
index 7cad3e6678..67fcb5f04e 100644
--- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
@@ -1397,7 +1397,8 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetEnvironmentVariableW( LPCWSTR name, LPWSTR val
len = us_value.Length / sizeof(WCHAR);
if (status == STATUS_BUFFER_TOO_SMALL) return len + 1;
if (!set_ntstatus( status )) return 0;
- if (size) val[len] = 0;
+ if (!size) return len + 1;
+ val[len] = 0;
return len;
}
More information about the wine-cvs
mailing list