mirror of
https://github.com/python/cpython.git
synced 2025-10-02 21:25:24 +00:00
_Py_CoerceLegacyLocale() restores LC_CTYPE on fail (GH-9044)
bpo-34544: If _Py_CoerceLegacyLocale() fails to coerce the C locale, restore the LC_CTYPE locale to the its previous value.
This commit is contained in:
parent
f01b2a1b84
commit
8ea09110d4
1 changed files with 13 additions and 1 deletions
|
@ -363,6 +363,13 @@ void
|
||||||
_Py_CoerceLegacyLocale(int warn)
|
_Py_CoerceLegacyLocale(int warn)
|
||||||
{
|
{
|
||||||
#ifdef PY_COERCE_C_LOCALE
|
#ifdef PY_COERCE_C_LOCALE
|
||||||
|
char *oldloc = NULL;
|
||||||
|
|
||||||
|
oldloc = _PyMem_RawStrdup(setlocale(LC_CTYPE, NULL));
|
||||||
|
if (oldloc == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const char *locale_override = getenv("LC_ALL");
|
const char *locale_override = getenv("LC_ALL");
|
||||||
if (locale_override == NULL || *locale_override == '\0') {
|
if (locale_override == NULL || *locale_override == '\0') {
|
||||||
/* LC_ALL is also not set (or is set to an empty string) */
|
/* LC_ALL is also not set (or is set to an empty string) */
|
||||||
|
@ -384,11 +391,16 @@ defined(HAVE_LANGINFO_H) && defined(CODESET)
|
||||||
#endif
|
#endif
|
||||||
/* Successfully configured locale, so make it the default */
|
/* Successfully configured locale, so make it the default */
|
||||||
_coerce_default_locale_settings(warn, target);
|
_coerce_default_locale_settings(warn, target);
|
||||||
return;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* No C locale warning here, as Py_Initialize will emit one later */
|
/* No C locale warning here, as Py_Initialize will emit one later */
|
||||||
|
|
||||||
|
setlocale(LC_CTYPE, oldloc);
|
||||||
|
|
||||||
|
done:
|
||||||
|
PyMem_RawFree(oldloc);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue