From: Victor Stinner Date: Mon, 3 Sep 2018 20:17:07 +0000 (+0200) Subject: _Py_CoerceLegacyLocale() restores LC_CTYPE on fail (GH-9044) (GH-9046) X-Git-Tag: v3.7.1rc1~121 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=84b0129b5e0a0e22aad22ae8db2e3833a228aa57;p=thirdparty%2FPython%2Fcpython.git _Py_CoerceLegacyLocale() restores LC_CTYPE on fail (GH-9044) (GH-9046) bpo-34544: If _Py_CoerceLegacyLocale() fails to coerce the C locale, restore the LC_CTYPE locale to the its previous value. (cherry picked from commit 8ea09110d413829f71d979d8c7073008cb87fb03) --- diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 539d62a2f0f4..ba4b54864fd8 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -475,6 +475,13 @@ void _Py_CoerceLegacyLocale(const _PyCoreConfig *config) { #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"); if (locale_override == NULL || *locale_override == '\0') { /* LC_ALL is also not set (or is set to an empty string) */ @@ -496,11 +503,16 @@ defined(HAVE_LANGINFO_H) && defined(CODESET) #endif /* Successfully configured locale, so make it the default */ _coerce_default_locale_settings(config, target); - return; + goto done; } } } /* No C locale warning here, as Py_Initialize will emit one later */ + + setlocale(LC_CTYPE, oldloc); + +done: + PyMem_RawFree(oldloc); #endif }