Skip to content

bpo-32030: Don't call _PyPathConfig_Fini() in Py_FinalizeEx() #4667

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 1, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Include/pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ PyAPI_FUNC(void) _PyPathConfig_Fini(void);
#endif
PyAPI_FUNC(void) Py_SetPath(const wchar_t *);
#ifdef MS_WINDOWS
int _Py_CheckPython3();
int _Py_CheckPython3(void);
#endif

/* In their own files */
Expand Down
10 changes: 6 additions & 4 deletions Modules/getpath.c
Original file line number Diff line number Diff line change
Expand Up @@ -625,11 +625,13 @@ calculate_program_full_path(const _PyMainInterpreterConfig *main_config,
else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) &&
execpath[0] == SEP)
{
size_t r = mbstowcs(program_full_path, execpath, MAXPATHLEN+1);
if (r == (size_t)-1 || r > MAXPATHLEN) {
/* Could not convert execpath, or it's too long. */
program_full_path[0] = '\0';
size_t len;
wchar_t *path = Py_DecodeLocale(execpath, &len);
if (path == NULL) {
return DECODE_LOCALE_ERR("executable path", len);
}
wcsncpy(program_full_path, path, MAXPATHLEN);
PyMem_RawFree(path);
}
#endif /* __APPLE__ */
else if (calculate->path_env) {
Expand Down
30 changes: 18 additions & 12 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 */
Expand Down Expand Up @@ -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;
}

Expand Down
19 changes: 13 additions & 6 deletions PC/getpathp.c
Original file line number Diff line number Diff line change
Expand Up @@ -721,12 +721,16 @@ static int
get_pth_filename(wchar_t *spbuffer, _PyPathConfig *config)
{
if (config->dll_path[0]) {
if (!change_ext(spbuffer, config->dll_path, L"._pth") && exists(spbuffer)) {
if (!change_ext(spbuffer, config->dll_path, L"._pth") &&
exists(spbuffer))
{
return 1;
}
}
if (config->program_full_path[0]) {
if (!change_ext(spbuffer, config->program_full_path, L"._pth") && exists(spbuffer)) {
if (!change_ext(spbuffer, config->program_full_path, L"._pth") &&
exists(spbuffer))
{
return 1;
}
}
Expand Down Expand Up @@ -823,8 +827,10 @@ calculate_module_search_path(const _PyMainInterpreterConfig *main_config,
#endif
/* We only use the default relative PYTHONPATH if we haven't
anything better to use! */
int skipdefault = (main_config->module_search_path_env!=NULL || calculate->home!=NULL || \
calculate->machine_path!=NULL || calculate->user_path!=NULL);
int skipdefault = (main_config->module_search_path_env != NULL ||
calculate->home != NULL ||
calculate->machine_path != NULL ||
calculate->user_path != NULL);

/* We need to construct a path from the following parts.
(1) the PYTHONPATH environment variable, if set;
Expand Down Expand Up @@ -882,7 +888,8 @@ calculate_module_search_path(const _PyMainInterpreterConfig *main_config,
start_buf = buf;

if (main_config->module_search_path_env) {
if (wcscpy_s(buf, bufsz - (buf - start_buf), main_config->module_search_path_env)) {
if (wcscpy_s(buf, bufsz - (buf - start_buf),
main_config->module_search_path_env)) {
return INIT_ERR_BUFFER_OVERFLOW();
}
buf = wcschr(buf, L'\0');
Expand Down Expand Up @@ -1214,7 +1221,7 @@ Py_GetProgramFullPath(void)
static int python3_checked = 0;
static HANDLE hPython3;
int
_Py_CheckPython3()
_Py_CheckPython3(void)
{
wchar_t py3path[MAXPATHLEN+1];
wchar_t *s;
Expand Down
2 changes: 0 additions & 2 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -1273,8 +1273,6 @@ Py_FinalizeEx(void)

call_ll_exitfuncs();

_PyPathConfig_Fini();

_PyRuntime_Finalize();
return status;
}
Expand Down