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 177d921c8c.
This commit is contained in:
Victor Stinner 2018-09-03 14:38:21 +02:00 committed by GitHub
parent f326714426
commit f01b2a1b84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 13 additions and 2 deletions

View File

@ -1291,10 +1291,17 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config,
int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag;
#endif #endif
_PyCoreConfig save_config = _PyCoreConfig_INIT; _PyCoreConfig save_config = _PyCoreConfig_INIT;
char *oldloc = NULL;
int res = -1; int res = -1;
/* Set LC_CTYPE to the user preferred locale */ oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
_Py_SetLocaleFromEnv(LC_CTYPE); 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 locale_coerced = 0;
int loops = 0; int loops = 0;
@ -1385,6 +1392,10 @@ pymain_read_conf(_PyMain *pymain, _PyCoreConfig *config,
done: done:
_PyCoreConfig_Clear(&save_config); _PyCoreConfig_Clear(&save_config);
if (oldloc != NULL) {
setlocale(LC_ALL, oldloc);
PyMem_RawFree(oldloc);
}
Py_UTF8Mode = init_utf8_mode ; Py_UTF8Mode = init_utf8_mode ;
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding;