summaryrefslogtreecommitdiffstats
path: root/Python/pylifecycle.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2019-11-20 11:08:13 (GMT)
committerGitHub <noreply@github.com>2019-11-20 11:08:13 (GMT)
commite7e699e4df73420ddccaa0057cd07ebb3b590b9b (patch)
tree1899fcf82a52a41f5df5c73d50c7af3f5a2906e2 /Python/pylifecycle.c
parent67e0de6f0b060ac8f373952f0ca4b3117ad5b611 (diff)
downloadcpython-e7e699e4df73420ddccaa0057cd07ebb3b590b9b.zip
cpython-e7e699e4df73420ddccaa0057cd07ebb3b590b9b.tar.gz
cpython-e7e699e4df73420ddccaa0057cd07ebb3b590b9b.tar.bz2
bpo-38858: Fix reference leak in pycore_init_types() (GH-17286)
Only call _PyGC_Init(), _PyExc_Init() and _PyErr_Init() in new_interpreter().
Diffstat (limited to 'Python/pylifecycle.c')
-rw-r--r--Python/pylifecycle.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 73114df..41b9596 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -558,7 +558,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
static PyStatus
-pycore_init_types(PyThreadState *tstate)
+pycore_init_types(PyThreadState *tstate, int is_main_interp)
{
PyStatus status;
@@ -567,18 +567,20 @@ pycore_init_types(PyThreadState *tstate)
return status;
}
- status = _PyTypes_Init();
- if (_PyStatus_EXCEPTION(status)) {
- return status;
- }
+ if (is_main_interp) {
+ status = _PyTypes_Init();
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+ }
- if (!_PyLong_Init()) {
- return _PyStatus_ERR("can't init longs");
- }
+ if (!_PyLong_Init()) {
+ return _PyStatus_ERR("can't init longs");
+ }
- status = _PyUnicode_Init();
- if (_PyStatus_EXCEPTION(status)) {
- return status;
+ status = _PyUnicode_Init();
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+ }
}
status = _PyExc_Init();
@@ -586,12 +588,14 @@ pycore_init_types(PyThreadState *tstate)
return status;
}
- if (!_PyFloat_Init()) {
- return _PyStatus_ERR("can't init float");
- }
+ if (is_main_interp) {
+ if (!_PyFloat_Init()) {
+ return _PyStatus_ERR("can't init float");
+ }
- if (_PyStructSequence_Init() < 0) {
- return _PyStatus_ERR("can't initialize structseq");
+ if (_PyStructSequence_Init() < 0) {
+ return _PyStatus_ERR("can't initialize structseq");
+ }
}
status = _PyErr_Init();
@@ -599,8 +603,10 @@ pycore_init_types(PyThreadState *tstate)
return status;
}
- if (!_PyContext_Init()) {
- return _PyStatus_ERR("can't init context");
+ if (is_main_interp) {
+ if (!_PyContext_Init()) {
+ return _PyStatus_ERR("can't init context");
+ }
}
return _PyStatus_OK();
@@ -690,7 +696,7 @@ pyinit_config(_PyRuntimeState *runtime,
config = &tstate->interp->config;
*tstate_p = tstate;
- status = pycore_init_types(tstate);
+ status = pycore_init_types(tstate, 1);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
@@ -1477,7 +1483,7 @@ new_interpreter(PyThreadState **tstate_p)
}
config = &interp->config;
- status = pycore_init_types(tstate);
+ status = pycore_init_types(tstate, 0);
/* XXX The following is lax in error checking */
PyObject *modules = PyDict_New();