]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
_PyPreConfig_Read() decodes argv at each iteration (GH-20786)
authorVictor Stinner <vstinner@python.org>
Wed, 10 Jun 2020 17:33:11 +0000 (19:33 +0200)
committerGitHub <noreply@github.com>
Wed, 10 Jun 2020 17:33:11 +0000 (19:33 +0200)
_PyPreConfig_Read() now calls _PyPreCmdline_SetArgv() at each
iteration, so bytes strings are decoded from the new encoding.

Python/preconfig.c

index fd94d7dda1c298e0c72e245076e15d002c1b40bf..149afcd99ab32f47b42376b7b58b959f54706343 100644 (file)
@@ -829,13 +829,6 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
     int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag;
 #endif
 
-    if (args) {
-        status = _PyPreCmdline_SetArgv(&cmdline, args);
-        if (_PyStatus_EXCEPTION(status)) {
-            goto done;
-        }
-    }
-
     int locale_coerced = 0;
     int loops = 0;
 
@@ -846,7 +839,7 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
         loops++;
         if (loops == 3) {
             status = _PyStatus_ERR("Encoding changed twice while "
-                               "reading the configuration");
+                                   "reading the configuration");
             goto done;
         }
 
@@ -857,6 +850,15 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
         Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding;
 #endif
 
+        if (args) {
+            // Set command line arguments at each iteration. If they are bytes
+            // strings, they are decoded from the new encoding.
+            status = _PyPreCmdline_SetArgv(&cmdline, args);
+            if (_PyStatus_EXCEPTION(status)) {
+                goto done;
+            }
+        }
+
         status = preconfig_read(config, &cmdline);
         if (_PyStatus_EXCEPTION(status)) {
             goto done;
@@ -896,7 +898,7 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args)
         }
 
         /* Reset the configuration before reading again the configuration,
-           just keep UTF-8 Mode value. */
+           just keep UTF-8 Mode and coerce C locale value. */
         int new_utf8_mode = config->utf8_mode;
         int new_coerce_c_locale = config->coerce_c_locale;
         preconfig_copy(config, &save_config);