diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py index dc3a15f8356..b84863fe53c 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 d1227f53067..37dc45333d7 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 f88a5fbe516..3a09af57156 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; }