]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
_Py_CoerceLegacyLocale() restores LC_CTYPE on fail (GH-9044) (GH-9046)
authorVictor Stinner <vstinner@redhat.com>
Mon, 3 Sep 2018 20:17:07 +0000 (22:17 +0200)
committerGitHub <noreply@github.com>
Mon, 3 Sep 2018 20:17:07 +0000 (22:17 +0200)
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)

Python/pylifecycle.c

index 539d62a2f0f4584a77e04768d14aaafc59f535d7..ba4b54864fd8e746f49ae20cb4925eb4f90fc4e2 100644 (file)
@@ -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
 }