mirror of
https://github.com/python/cpython.git
synced 2025-09-13 12:17:24 +00:00
bpo-32030: Don't call _PyPathConfig_Fini() in Py_FinalizeEx() (#4667)
Changes: * _PyPathConfig_Fini() cannot be called in Py_FinalizeEx(). Py_Initialize() and Py_Finalize() can be called multiple times, but it must not "forget" parameters set by Py_SetProgramName(), Py_SetPath() or Py_SetPythonHome(), whereas _PyPathConfig_Fini() clear all these parameters. * config_get_program_name() and calculate_program_full_path() now also decode paths using Py_DecodeLocale() to use the surrogateescape error handler, rather than decoding using mbstowcs() which is strict. * Change _Py_CheckPython3() prototype: () => (void) * Truncate a few lines which were too long
This commit is contained in:
parent
9ac3d88827
commit
ebac19dad6
5 changed files with 38 additions and 25 deletions
|
@ -888,15 +888,12 @@ config_get_program_name(_PyMainInterpreterConfig *config)
|
|||
See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
|
||||
script. */
|
||||
if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
|
||||
wchar_t* buffer;
|
||||
size_t len = strlen(p) + 1;
|
||||
|
||||
buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
|
||||
if (buffer == NULL) {
|
||||
return _Py_INIT_NO_MEMORY();
|
||||
size_t len;
|
||||
wchar_t* program_name = Py_DecodeLocale(p, &len);
|
||||
if (program_name == NULL) {
|
||||
return SET_DECODE_ERROR("PYTHONEXECUTABLE environment "
|
||||
"variable", len);
|
||||
}
|
||||
|
||||
mbstowcs(buffer, p, len);
|
||||
pymain->config.program_name = buffer;
|
||||
}
|
||||
#ifdef WITH_NEXT_FRAMEWORK
|
||||
|
@ -907,11 +904,12 @@ config_get_program_name(_PyMainInterpreterConfig *config)
|
|||
* the argv0 of the stub executable
|
||||
*/
|
||||
size_t len;
|
||||
wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, &len);
|
||||
if (wbuf == NULL) {
|
||||
return SET_DECODE_ERROR("__PYVENV_LAUNCHER__", len);
|
||||
wchar_t* program_name = Py_DecodeLocale(pyvenv_launcher, &len);
|
||||
if (program_name == NULL) {
|
||||
return SET_DECODE_ERROR("__PYVENV_LAUNCHER__ environment "
|
||||
"variable", len);
|
||||
}
|
||||
pymain->config.program_name = wbuf;
|
||||
pymain->config.program_name = program_name;
|
||||
}
|
||||
}
|
||||
#endif /* WITH_NEXT_FRAMEWORK */
|
||||
|
@ -1666,6 +1664,14 @@ pymain_impl(_PyMain *pymain)
|
|||
other special meaning */
|
||||
pymain->status = 120;
|
||||
}
|
||||
|
||||
/* _PyPathConfig_Fini() cannot be called in Py_FinalizeEx().
|
||||
Py_Initialize() and Py_Finalize() can be called multiple times, but it
|
||||
must not "forget" parameters set by Py_SetProgramName(), Py_SetPath() or
|
||||
Py_SetPythonHome(), whereas _PyPathConfig_Fini() clear all these
|
||||
parameters. */
|
||||
_PyPathConfig_Fini();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue