From: Zhiyi Zhang zzhang@codeweavers.com
Initialize the calendars variable after checking if locale is NULL before using it to avoid NULL pointer references. Fix a Excel 2016 crash when formatting dates with the custom format 'ddd'. It calls EnumDateFormatsExEx() with the 'yi-Hebr' locale, which is added in Win10.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55099 --- dlls/kernel32/tests/locale.c | 20 ++++++++++++++++++++ dlls/kernelbase/locale.c | 4 +++- 2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index 5c99e644f15..83824b86947 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -8402,6 +8402,25 @@ static void dump_sortkeys( char *argv[] ) fclose( f ); }
+static BOOL CALLBACK EnumDateFormatsExEx_proc(LPWSTR date_format_string, CALID calendar_id, LPARAM lp) +{ + return TRUE; +} + +static void test_EnumDateFormatsExEx(void) +{ + BOOL ret; + + /* yi-Hebr is missing on versions < Win10 */ + ret = EnumDateFormatsExEx(EnumDateFormatsExEx_proc, L"yi-Hebr", DATE_SHORTDATE, 0); + ok(ret || (!ret && GetLastError() == ERROR_INVALID_PARAMETER), /* < Win10 */ + "EnumDateFormatsExEx failed, error %#lx.\n", GetLastError()); + + ret = EnumDateFormatsExEx(EnumDateFormatsExEx_proc, L"yi-Hebr", DATE_LONGDATE, 0); + ok(ret || (!ret && GetLastError() == ERROR_INVALID_PARAMETER), /* < Win10 */ + "EnumDateFormatsExEx failed, error %#lx.\n", GetLastError()); +} + START_TEST(locale) { char **argv; @@ -8421,6 +8440,7 @@ START_TEST(locale) test_EnumTimeFormatsA(); test_EnumTimeFormatsW(); test_EnumDateFormatsA(); + test_EnumDateFormatsExEx(); test_GetLocaleInfoA(); test_GetLocaleInfoW(); test_GetLocaleInfoEx(); diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 45180f4bb8a..e8060fe9205 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -4390,7 +4390,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumDateFormats( DATEFMT_ENUMPROCW proc, INT i, j, ret; DWORD pos; const struct calendar *cal; - const USHORT *calendars = locale_strings + locale->scalendartype; + const USHORT *calendars; const DWORD *array;
if (!proc || !locale) @@ -4399,6 +4399,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH Internal_EnumDateFormats( DATEFMT_ENUMPROCW proc, return FALSE; }
+ calendars = locale_strings + locale->scalendartype; + switch (flags & ~LOCALE_USE_CP_ACP) { case 0: