From c63a08586f19af7e6a65a064696743f648006fcd Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 28 Nov 2017 19:36:16 +0100 Subject: [PATCH] kernel32: Don't return a parent locale for neutral locales in GetLocaleInfoEx. Signed-off-by: Alexandre Julliard --- dlls/kernel32/locale.c | 20 +++++++++++++------- dlls/kernel32/tests/locale.c | 8 ++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index 53bd8a426bf..e4c323ead63 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -1807,16 +1807,22 @@ INT WINAPI GetLocaleInfoEx(LPCWSTR locale, LCTYPE info, LPWSTR buffer, INT len) if (!lcid) return 0; /* special handling for neutral locale names */ - if (info == LOCALE_SNAME && locale && strlenW(locale) == 2) + if (locale && strlenW(locale) == 2) { - if (len && len < 3) + switch (info) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return 0; + case LOCALE_SNAME: + if (len && len < 3) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; + } + if (len) strcpyW(buffer, locale); + return 3; + case LOCALE_SPARENT: + if (len) buffer[0] = 0; + return 1; } - - if (len) strcpyW(buffer, locale); - return 3; } return GetLocaleInfoW(lcid, info, buffer, len); diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index 97ed6fab7ab..2af4946f2f5 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -4483,6 +4483,14 @@ static void test_GetLocaleInfoEx(void) ok(ret == lstrlenW(bufferW)+1, "got %d\n", ret); ok(!lstrcmpW(bufferW, enuW), "got %s\n", wine_dbgstr_w(bufferW)); + ret = pGetLocaleInfoEx(enusW, LOCALE_SPARENT, bufferW, sizeof(bufferW)/sizeof(WCHAR)); + ok(ret == lstrlenW(bufferW)+1, "got %d\n", ret); + ok(!lstrcmpW(bufferW, enW), "got %s\n", wine_dbgstr_w(bufferW)); + + ret = pGetLocaleInfoEx(enW, LOCALE_SPARENT, bufferW, sizeof(bufferW)/sizeof(WCHAR)); + ok(ret == 1, "got %d\n", ret); + ok(!bufferW[0], "got %s\n", wine_dbgstr_w(bufferW)); + ret = pGetLocaleInfoEx(enW, LOCALE_SCOUNTRY, bufferW, sizeof(bufferW)/sizeof(WCHAR)); ok(ret == lstrlenW(bufferW)+1, "got %d\n", ret); if ((PRIMARYLANGID(LANGIDFROMLCID(GetSystemDefaultLCID())) != LANG_ENGLISH) || -- 2.11.4.GIT