]> granicus.if.org Git - python/commitdiff
bpo-34523: Fix config_init_fs_encoding() for ASCII (GH-10232)
authorVictor Stinner <vstinner@redhat.com>
Tue, 30 Oct 2018 11:58:10 +0000 (12:58 +0100)
committerGitHub <noreply@github.com>
Tue, 30 Oct 2018 11:58:10 +0000 (12:58 +0100)
* bpo-34523, bpo-34403: Fix config_init_fs_encoding(): it now uses
  ASCII if _Py_GetForceASCII() is true.
* Fix a regression of commit b2457efc78b74a1d6d1b77d11a939e886b8a4e2c.
* Fix also a memory leak: get_locale_encoding() already allocates
  memory, no need to duplicate the string.

Include/coreconfig.h
Python/coreconfig.c

index ef043ab02df6d4380b9b672dbb64aeda848d507d..83c4e7ee4dbefc4ea0ce8700618630ad7eec83b0 100644 (file)
@@ -75,6 +75,8 @@ typedef struct {
          highest priority;
        * PYTHONIOENCODING environment variable;
        * The UTF-8 Mode uses UTF-8/surrogateescape;
+       * If Python forces the usage of the ASCII encoding (ex: C locale
+         or POSIX locale on FreeBSD or HP-UX), use ASCII/surrogateescape;
        * locale encoding: ANSI code page on Windows, UTF-8 on Android,
          LC_CTYPE locale encoding on other platforms;
        * On Windows, "surrogateescape" error handler;
index fae32e533aa9cd5bc261a33acc25cf378ea3ab54..a82175e4fd26a9e9bf70d70374ee3c5ff28c9c88 100644 (file)
@@ -1164,13 +1164,17 @@ config_init_fs_encoding(_PyCoreConfig *config)
         }
     }
 
-    /* Windows defaults to utf-8/surrogatepass (PEP 529) */
+    /* Windows defaults to utf-8/surrogatepass (PEP 529).
+
+       Note: UTF-8 Mode takes the same code path and the Legacy Windows FS
+             encoding has the priortiy over UTF-8 Mode. */
     if (config->filesystem_encoding == NULL) {
         config->filesystem_encoding = _PyMem_RawStrdup("utf-8");
         if (config->filesystem_encoding == NULL) {
             return _Py_INIT_NO_MEMORY();
         }
     }
+
     if (config->filesystem_errors == NULL) {
         config->filesystem_errors = _PyMem_RawStrdup("surrogatepass");
         if (config->filesystem_errors == NULL) {
@@ -1178,30 +1182,28 @@ config_init_fs_encoding(_PyCoreConfig *config)
         }
     }
 #else
-    if (config->utf8_mode) {
-        /* UTF-8 Mode use: utf-8/surrogateescape */
-        if (config->filesystem_encoding == NULL) {
+    if (config->filesystem_encoding == NULL) {
+        if (config->utf8_mode) {
+            /* UTF-8 Mode use: utf-8/surrogateescape */
             config->filesystem_encoding = _PyMem_RawStrdup("utf-8");
-            if (config->filesystem_encoding == NULL) {
-                return _Py_INIT_NO_MEMORY();
-            }
+            /* errors defaults to surrogateescape above */
         }
-        /* errors defaults to surrogateescape above */
-    }
-
-    if (config->filesystem_encoding == NULL) {
-        /* macOS and Android use UTF-8, other platforms use
-           the locale encoding. */
-        char *locale_encoding;
+        else if (_Py_GetForceASCII()) {
+            config->filesystem_encoding = _PyMem_RawStrdup("ascii");
+        }
+        else {
+            /* macOS and Android use UTF-8,
+               other platforms use the locale encoding. */
 #if defined(__APPLE__) || defined(__ANDROID__)
-        locale_encoding = "UTF-8";
+            config->filesystem_encoding = _PyMem_RawStrdup("utf-8");
 #else
-        _PyInitError err = get_locale_encoding(&locale_encoding);
-        if (_Py_INIT_FAILED(err)) {
-            return err;
-        }
+            _PyInitError err = get_locale_encoding(&config->filesystem_encoding);
+            if (_Py_INIT_FAILED(err)) {
+                return err;
+            }
 #endif
-        config->filesystem_encoding = _PyMem_RawStrdup(locale_encoding);
+        }
+
         if (config->filesystem_encoding == NULL) {
             return _Py_INIT_NO_MEMORY();
         }