diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-05-20 15:16:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-20 15:16:38 (GMT) |
commit | 0f72147ce2b3d65235b41eddc6a57be40237b5c7 (patch) | |
tree | ffab92ed1baf4ff593145661b513e18cc7c8bb88 /Python/preconfig.c | |
parent | 522ccef8690970fc4f78f51a3adb995f2547871a (diff) | |
download | cpython-0f72147ce2b3d65235b41eddc6a57be40237b5c7.zip cpython-0f72147ce2b3d65235b41eddc6a57be40237b5c7.tar.gz cpython-0f72147ce2b3d65235b41eddc6a57be40237b5c7.tar.bz2 |
bpo-36763: Fix _PyRuntime.preconfig.coerce_c_locale (GH-13444)
_PyRuntime.preconfig.coerce_c_locale can now be used to
check if the C locale has been coerced.
* Fix _Py_LegacyLocaleDetected(): don't attempt to coerce the
C locale if LC_ALL environment variable is set. Add 'warn'
parameter: emit_stderr_warning_for_legacy_locale() must not
the LC_ALL env var.
* _PyPreConfig_Write() sets coerce_c_locale to 0 if
_Py_CoerceLegacyLocale() fails.
Diffstat (limited to 'Python/preconfig.c')
-rw-r--r-- | Python/preconfig.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/Python/preconfig.c b/Python/preconfig.c index 71a6ee6..4df6208 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -660,7 +660,7 @@ preconfig_init_coerce_c_locale(_PyPreConfig *config) It is only coerced if if the LC_CTYPE locale is "C". */ if (config->coerce_c_locale < 0 || config->coerce_c_locale == 1) { /* The C locale enables the C locale coercion (PEP 538) */ - if (_Py_LegacyLocaleDetected()) { + if (_Py_LegacyLocaleDetected(0)) { config->coerce_c_locale = 2; } else { @@ -888,32 +888,38 @@ done: - set the LC_CTYPE locale (coerce C locale, PEP 538) and set the UTF-8 mode (PEP 540) - If the memory allocator is changed, config is re-allocated with new - allocator. So calling _PyPreConfig_Clear(config) is safe after this call. + The applied configuration is written into _PyRuntime.preconfig. + If the C locale cannot be coerced, set coerce_c_locale to 0. Do nothing if called after Py_Initialize(): ignore the new pre-configuration. */ _PyInitError -_PyPreConfig_Write(const _PyPreConfig *config) +_PyPreConfig_Write(const _PyPreConfig *src_config) { + _PyPreConfig config; + _PyPreConfig_InitFromPreConfig(&config, src_config); + if (_PyRuntime.core_initialized) { /* bpo-34008: Calling this functions after Py_Initialize() ignores the new configuration. */ return _Py_INIT_OK(); } - PyMemAllocatorName name = (PyMemAllocatorName)config->allocator; + PyMemAllocatorName name = (PyMemAllocatorName)config.allocator; if (name != PYMEM_ALLOCATOR_NOT_SET) { if (_PyMem_SetupAllocators(name) < 0) { return _Py_INIT_ERR("Unknown PYTHONMALLOC allocator"); } } - _PyPreConfig_SetGlobalConfig(config); + _PyPreConfig_SetGlobalConfig(&config); - if (config->configure_locale) { - if (config->coerce_c_locale) { - _Py_CoerceLegacyLocale(config->coerce_c_locale_warn); + if (config.configure_locale) { + if (config.coerce_c_locale) { + if (!_Py_CoerceLegacyLocale(config.coerce_c_locale_warn)) { + /* C locale not coerced */ + config.coerce_c_locale = 0; + } } /* Set LC_CTYPE to the user preferred locale */ @@ -921,7 +927,7 @@ _PyPreConfig_Write(const _PyPreConfig *config) } /* Write the new pre-configuration into _PyRuntime */ - _PyPreConfig_Copy(&_PyRuntime.preconfig, config); + _PyPreConfig_Copy(&_PyRuntime.preconfig, &config); return _Py_INIT_OK(); } |