https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=018ab22dfdf64b40027f1f9cbb65088fe3cddafb
commit 018ab22dfdf64b40027f1f9cbb65088fe3cddafb Author: Corinna Vinschen <cori...@vinschen.de> Date: Fri Oct 30 20:13:26 2015 +0100 Workaround bug in LocaleNameToLCID on Windows 10 * nlsfuncs.cc (__get_lcid_from_locale): Handle LocaleNameToLCID returning LOCALE_CUSTOM_UNSPECIFIED instead of failing in case of an unsupported locale on Windows 10. Signed-off-by: Corinna Vinschen <cori...@vinschen.de> Diff: --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/nlsfuncs.cc | 19 +++++++++++++------ winsup/cygwin/release/2.3.0 | 3 +++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 255d795..ba11e0c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2015-10-30 Corinna Vinschen <cori...@vinschen.de> + * nlsfuncs.cc (__get_lcid_from_locale): Handle LocaleNameToLCID + returning LOCALE_CUSTOM_UNSPECIFIED instead of failing in case of + an unsupported locale on Windows 10. + +2015-10-30 Corinna Vinschen <cori...@vinschen.de> + * exceptions.cc (sigpacket::process): Avoid potentially double unlocking the TLS mutex. diff --git a/winsup/cygwin/nlsfuncs.cc b/winsup/cygwin/nlsfuncs.cc index f7031f9..1b2b2d7 100644 --- a/winsup/cygwin/nlsfuncs.cc +++ b/winsup/cygwin/nlsfuncs.cc @@ -1,6 +1,6 @@ /* nlsfuncs.cc: NLS helper functions - Copyright 2010, 2011, 2012, 2013 Red Hat, Inc. + Copyright 2010, 2011, 2012, 2013, 2015 Red Hat, Inc. This file is part of Cygwin. @@ -88,7 +88,9 @@ __get_lcid_from_locale (const char *name) *c = '-'; mbstowcs (wlocale, locale, ENCODING_LEN + 1); lcid = LocaleNameToLCID (wlocale, 0); - if (lcid == 0) + /* Bug on Windows 10: LocaleNameToLCID returns LOCALE_CUSTOM_UNSPECIFIED + for unknown locales. */ + if (lcid == 0 || lcid == LOCALE_CUSTOM_UNSPECIFIED) { /* Unfortunately there are a couple of locales for which no form without a Script part per RFC 4646 exists. @@ -127,24 +129,29 @@ __get_lcid_from_locale (const char *name) { /* Vista/2K8 is missing sr-ME and sr-RS. It has only the deprecated sr-CS. So we map ME and RS to CS here. */ - if (lcid == 0) + if (lcid == 0 || lcid == LOCALE_CUSTOM_UNSPECIFIED) lcid = LocaleNameToLCID (L"sr-Cyrl-CS", 0); /* "@latin" modifier for the sr_XY locales changes collation behaviour so lcid should accommodate that by being set to the Latin sublang. */ - if (lcid != 0 && has_modifier ("@latin")) + if (lcid != 0 && lcid != LOCALE_CUSTOM_UNSPECIFIED + && has_modifier ("@latin")) lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) - 1); } else if (!strncmp (locale, "uz-", 3)) { /* Equivalent for "@cyrillic" modifier in uz_UZ locale */ - if (lcid != 0 && has_modifier ("@cyrillic")) + if (lcid != 0 && lcid != LOCALE_CUSTOM_UNSPECIFIED + && has_modifier ("@cyrillic")) lcid = MAKELANGID (lcid & 0x3ff, (lcid >> 10) + 1); } break; } } - last_lcid = lcid ?: (LCID) -1; + if (lcid && lcid != LOCALE_CUSTOM_UNSPECIFIED) + last_lcid = lcid; + else + last_lcid = (LCID) -1; debug_printf ("LCID=%04y", last_lcid); return last_lcid; } diff --git a/winsup/cygwin/release/2.3.0 b/winsup/cygwin/release/2.3.0 index 123a0c7..d58de2f 100644 --- a/winsup/cygwin/release/2.3.0 +++ b/winsup/cygwin/release/2.3.0 @@ -60,3 +60,6 @@ Bug Fixes - Fix sigwait(3) to return errno instead of -1 and never to return with EINTR. - Fix pthread_kill(3) to return errno instead of -1. + +- Workaround a bug in Windows 10 NLS handling. + Addresses: https://cygwin.com/ml/cygwin/2015-10/msg00547.html