Skip to content

Commit

Permalink
_PyPreConfig_Read() decodes argv at each iteration (GH-20786)
Browse files Browse the repository at this point in the history
_PyPreConfig_Read() now calls _PyPreCmdline_SetArgv() at each
iteration, so bytes strings are decoded from the new encoding.
  • Loading branch information
vstinner committed Jun 10, 2020
1 parent f6e58ae commit 8eb4aea
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions Python/preconfig.c
Expand Up @@ -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;

Expand All @@ -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;
}

Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 8eb4aea

Please sign in to comment.