]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38858: Fix reference leak in pycore_init_types() (GH-17286)
authorVictor Stinner <vstinner@python.org>
Wed, 20 Nov 2019 11:08:13 +0000 (12:08 +0100)
committerGitHub <noreply@github.com>
Wed, 20 Nov 2019 11:08:13 +0000 (12:08 +0100)
Only call _PyGC_Init(), _PyExc_Init() and _PyErr_Init() in
new_interpreter().

Python/pylifecycle.c

index 73114df79cd8e33047094c5ce5c232e5bf5b940f..41b9596b60d01ad52ee881aa11c8cd0b58ee5636 100644 (file)
@@ -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();