]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38858: Fix ref leak in pycore_interp_init() (GH-17512)
authorVictor Stinner <vstinner@python.org>
Sun, 8 Dec 2019 20:55:58 +0000 (21:55 +0100)
committerGitHub <noreply@github.com>
Sun, 8 Dec 2019 20:55:58 +0000 (21:55 +0100)
bpo-38858, bpo-38997: _PySys_Create() returns a strong reference to
the sys module: Py_DECREF() is needed when we are done with the
module.

Python/pylifecycle.c

index 8bd71a350de86a83379fb1e859ddb65109ba3c09..823d96e86a4388498edf7335fb794310f7c1a07e 100644 (file)
@@ -705,24 +705,29 @@ static PyStatus
 pycore_interp_init(PyThreadState *tstate)
 {
     PyStatus status;
+    PyObject *sysmod = NULL;
 
     status = pycore_init_types(tstate);
     if (_PyStatus_EXCEPTION(status)) {
-        return status;
+        goto done;
     }
 
-    PyObject *sysmod;
     status = _PySys_Create(tstate, &sysmod);
     if (_PyStatus_EXCEPTION(status)) {
-        return status;
+        goto done;
     }
 
     status = pycore_init_builtins(tstate);
     if (_PyStatus_EXCEPTION(status)) {
-        return status;
+        goto done;
     }
 
-    return pycore_init_import_warnings(tstate, sysmod);
+    status = pycore_init_import_warnings(tstate, sysmod);
+
+done:
+    /* sys.modules['sys'] contains a strong reference to the module */
+    Py_XDECREF(sysmod);
+    return status;
 }