summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_super.py9
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/typeobject.c6
3 files changed, 15 insertions, 3 deletions
diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py
index dc3a15f..b84863f 100644
--- a/Lib/test/test_super.py
+++ b/Lib/test/test_super.py
@@ -171,6 +171,15 @@ class TestSuper(unittest.TestCase):
c = f().__closure__[0]
self.assertRaises(TypeError, X.meth, c)
+ def test_super_init_leaks(self):
+ # Issue #26718: super.__init__ leaked memory if called multiple times.
+ # This will be caught by regrtest.py -R if this leak.
+ # NOTE: Despite the use in the test a direct call of super.__init__
+ # is not endorsed.
+ sp = super(float, 1.0)
+ for i in range(1000):
+ super.__init__(sp, int, i)
+
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
index d1227f5..37dc453 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: tba
Core and Builtins
-----------------
+- Issue #26718: super.__init__ no longer leaks memory if called multiple times.
+ NOTE: A direct call of super.__init__ is not endorsed!
+
- Issue #25339: PYTHONIOENCODING now has priority over locale in setting the
error handler for stdin and stdout.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index f88a5fb..3a09af5 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -7336,9 +7336,9 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds)
Py_INCREF(obj);
}
Py_INCREF(type);
- su->type = type;
- su->obj = obj;
- su->obj_type = obj_type;
+ Py_XSETREF(su->type, type);
+ Py_XSETREF(su->obj, obj);
+ Py_XSETREF(su->obj_type, obj_type);
return 0;
}