Skip to content

Commit e7e699e

Browse files
authored
bpo-38858: Fix reference leak in pycore_init_types() (GH-17286)
Only call _PyGC_Init(), _PyExc_Init() and _PyErr_Init() in new_interpreter().
1 parent 67e0de6 commit e7e699e

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

Python/pylifecycle.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
558558

559559

560560
static PyStatus
561-
pycore_init_types(PyThreadState *tstate)
561+
pycore_init_types(PyThreadState *tstate, int is_main_interp)
562562
{
563563
PyStatus status;
564564

@@ -567,40 +567,46 @@ pycore_init_types(PyThreadState *tstate)
567567
return status;
568568
}
569569

570-
status = _PyTypes_Init();
571-
if (_PyStatus_EXCEPTION(status)) {
572-
return status;
573-
}
570+
if (is_main_interp) {
571+
status = _PyTypes_Init();
572+
if (_PyStatus_EXCEPTION(status)) {
573+
return status;
574+
}
574575

575-
if (!_PyLong_Init()) {
576-
return _PyStatus_ERR("can't init longs");
577-
}
576+
if (!_PyLong_Init()) {
577+
return _PyStatus_ERR("can't init longs");
578+
}
578579

579-
status = _PyUnicode_Init();
580-
if (_PyStatus_EXCEPTION(status)) {
581-
return status;
580+
status = _PyUnicode_Init();
581+
if (_PyStatus_EXCEPTION(status)) {
582+
return status;
583+
}
582584
}
583585

584586
status = _PyExc_Init();
585587
if (_PyStatus_EXCEPTION(status)) {
586588
return status;
587589
}
588590

589-
if (!_PyFloat_Init()) {
590-
return _PyStatus_ERR("can't init float");
591-
}
591+
if (is_main_interp) {
592+
if (!_PyFloat_Init()) {
593+
return _PyStatus_ERR("can't init float");
594+
}
592595

593-
if (_PyStructSequence_Init() < 0) {
594-
return _PyStatus_ERR("can't initialize structseq");
596+
if (_PyStructSequence_Init() < 0) {
597+
return _PyStatus_ERR("can't initialize structseq");
598+
}
595599
}
596600

597601
status = _PyErr_Init();
598602
if (_PyStatus_EXCEPTION(status)) {
599603
return status;
600604
}
601605

602-
if (!_PyContext_Init()) {
603-
return _PyStatus_ERR("can't init context");
606+
if (is_main_interp) {
607+
if (!_PyContext_Init()) {
608+
return _PyStatus_ERR("can't init context");
609+
}
604610
}
605611

606612
return _PyStatus_OK();
@@ -690,7 +696,7 @@ pyinit_config(_PyRuntimeState *runtime,
690696
config = &tstate->interp->config;
691697
*tstate_p = tstate;
692698

693-
status = pycore_init_types(tstate);
699+
status = pycore_init_types(tstate, 1);
694700
if (_PyStatus_EXCEPTION(status)) {
695701
return status;
696702
}
@@ -1477,7 +1483,7 @@ new_interpreter(PyThreadState **tstate_p)
14771483
}
14781484
config = &interp->config;
14791485

1480-
status = pycore_init_types(tstate);
1486+
status = pycore_init_types(tstate, 0);
14811487

14821488
/* XXX The following is lax in error checking */
14831489
PyObject *modules = PyDict_New();

0 commit comments

Comments
 (0)