]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-93103: Py_DecodeLocale() uses _PyRuntime.preconfig (#93187)
authorVictor Stinner <vstinner@python.org>
Tue, 24 May 2022 22:09:48 +0000 (00:09 +0200)
committerGitHub <noreply@github.com>
Tue, 24 May 2022 22:09:48 +0000 (00:09 +0200)
The Py_DecodeLocale() and Py_EncodeLocale() now use
_PyRuntime.preconfig, rather than Py_UTF8Mode and
Py_LegacyWindowsFSEncodingFlag global configuration varibles, to
decide if the UTF-8 encoding is used or not.

As documented, these functions must not be called before Python is
preinitialized. The new PyConfig API should now be used, rather than
using deprecated functions like Py_SetPath() or PySys_SetArgv().

Python/fileutils.c
Python/preconfig.c

index a38886a17ccbbe13c64ee9849d61c4768be84dc5..7e5d01f6e63d3bc74aaded8609eabc4c44707615 100644 (file)
@@ -603,9 +603,9 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen,
     return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason,
                             errors);
 #else
-    int use_utf8 = (Py_UTF8Mode == 1);
+    int use_utf8 = (_PyRuntime.preconfig.utf8_mode >= 1);
 #ifdef MS_WINDOWS
-    use_utf8 |= !Py_LegacyWindowsFSEncodingFlag;
+    use_utf8 |= (_PyRuntime.preconfig.legacy_windows_fs_encoding == 0);
 #endif
     if (use_utf8) {
         return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason,
@@ -795,9 +795,9 @@ encode_locale_ex(const wchar_t *text, char **str, size_t *error_pos,
     return _Py_EncodeUTF8Ex(text, str, error_pos, reason,
                             raw_malloc, errors);
 #else
-    int use_utf8 = (Py_UTF8Mode == 1);
+    int use_utf8 = (_PyRuntime.preconfig.utf8_mode >= 1);
 #ifdef MS_WINDOWS
-    use_utf8 |= !Py_LegacyWindowsFSEncodingFlag;
+    use_utf8 |= (_PyRuntime.preconfig.legacy_windows_fs_encoding == 0);
 #endif
     if (use_utf8) {
         return _Py_EncodeUTF8Ex(text, str, error_pos, reason,
index afa16cccf32e96c6859b93860b3e6f14e9338a07..e7125cd2e3e0e3f69461436f1d89467c117cccd1 100644 (file)
@@ -826,12 +826,10 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
         _Py_SetLocaleFromEnv(LC_CTYPE);
     }
 
-    _PyPreCmdline cmdline = _PyPreCmdline_INIT;
-    int init_utf8_mode = Py_UTF8Mode;
-#ifdef MS_WINDOWS
-    int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag;
-#endif
+    PyPreConfig save_runtime_config;
+    preconfig_copy(&save_runtime_config, &_PyRuntime.preconfig);
 
+    _PyPreCmdline cmdline = _PyPreCmdline_INIT;
     int locale_coerced = 0;
     int loops = 0;
 
@@ -847,11 +845,9 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
         }
 
         /* bpo-34207: Py_DecodeLocale() and Py_EncodeLocale() depend
-           on Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag. */
-        Py_UTF8Mode = config->utf8_mode;
-#ifdef MS_WINDOWS
-        Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding;
-#endif
+           on the utf8_mode and legacy_windows_fs_encoding members
+           of _PyRuntime.preconfig. */
+        preconfig_copy(&_PyRuntime.preconfig, config);
 
         if (args) {
             // Set command line arguments at each iteration. If they are bytes
@@ -914,14 +910,10 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
     status = _PyStatus_OK();
 
 done:
-    if (init_ctype_locale != NULL) {
-        setlocale(LC_CTYPE, init_ctype_locale);
-        PyMem_RawFree(init_ctype_locale);
-    }
-    Py_UTF8Mode = init_utf8_mode ;
-#ifdef MS_WINDOWS
-    Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding;
-#endif
+    // Revert side effects
+    setlocale(LC_CTYPE, init_ctype_locale);
+    PyMem_RawFree(init_ctype_locale);
+    preconfig_copy(&_PyRuntime.preconfig, &save_runtime_config);
     _PyPreCmdline_Clear(&cmdline);
     return status;
 }