diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-10-30 11:58:10 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-30 11:58:10 (GMT) |
commit | 905f1ace5f7424e314ca7bed997868a2a3044839 (patch) | |
tree | 19ad55e69a5370595a3c267be6d0115eda48fff5 /Python | |
parent | b232df9197a19e78d0e2a751e56e0e62547354ec (diff) | |
download | cpython-905f1ace5f7424e314ca7bed997868a2a3044839.zip cpython-905f1ace5f7424e314ca7bed997868a2a3044839.tar.gz cpython-905f1ace5f7424e314ca7bed997868a2a3044839.tar.bz2 |
bpo-34523: Fix config_init_fs_encoding() for ASCII (GH-10232)
* 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.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/coreconfig.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/Python/coreconfig.c b/Python/coreconfig.c index fae32e5..a82175e 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -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(); } |