diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-09-03 12:38:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-03 12:38:21 (GMT) |
commit | f01b2a1b84ee08df73a78cf1017eecf15e3cb995 (patch) | |
tree | 9079820452b662ca8b9c95879459063be0e02449 /Modules/main.c | |
parent | f3267144269b873bcb87a9fcafe94b37be1bcfdc (diff) | |
download | cpython-f01b2a1b84ee08df73a78cf1017eecf15e3cb995.zip cpython-f01b2a1b84ee08df73a78cf1017eecf15e3cb995.tar.gz cpython-f01b2a1b84ee08df73a78cf1017eecf15e3cb995.tar.bz2 |
bpo-34544: Fix setlocale() in pymain_read_conf() (GH-9041)
bpo-34485, bpo-34544: On some FreeBSD, nl_langinfo(CODESET) fails if
LC_ALL or LC_CTYPE is set to an invalid locale name. Replace
_Py_SetLocaleFromEnv(LC_CTYPE) with _Py_SetLocaleFromEnv(LC_ALL) to
initialize properly locales.
Partially revert commit 177d921c8c03d30daa32994362023f777624b10d.
Diffstat (limited to 'Modules/main.c')
-rw-r--r-- | Modules/main.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/Modules/main.c b/Modules/main.c index 1ab555b..974a0a6 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1291,10 +1291,17 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; #endif _PyCoreConfig save_config = _PyCoreConfig_INIT; + char *oldloc = NULL; int res = -1; - /* Set LC_CTYPE to the user preferred locale */ - _Py_SetLocaleFromEnv(LC_CTYPE); + oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); + if (oldloc == NULL) { + pymain->err = _Py_INIT_NO_MEMORY(); + goto done; + } + + /* Reconfigure the locale to the default for this process */ + _Py_SetLocaleFromEnv(LC_ALL); int locale_coerced = 0; int loops = 0; @@ -1385,6 +1392,10 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config, done: _PyCoreConfig_Clear(&save_config); + if (oldloc != NULL) { + setlocale(LC_ALL, oldloc); + PyMem_RawFree(oldloc); + } Py_UTF8Mode = init_utf8_mode ; #ifdef MS_WINDOWS Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; |