From a6a277d8316973ca3f546e5111430a8c4ee07181 Mon Sep 17 00:00:00 2001 From: "Michael W. Hudson" Date: Fri, 8 Aug 2003 13:57:22 +0000 Subject: [PATCH] /* XXX From here until type is allocated, "return NULL" leaks bases! */ Sure looks like it to me! When I run the leak2.py script I posted to python-dev, I only see three reference leaks in all of test_descr. When I run test_descr.test_main, I still see 46 leaks. This clearly demands posting a yelp to python-dev :-) This certainly should be applied to release23-maint, and in all likelyhood release22-maint as well. --- Objects/typeobject.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 2a7df8aa632..5c0f73aef6b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1618,12 +1618,15 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) /* Calculate best base, and check that all bases are type objects */ base = best_base(bases); - if (base == NULL) + if (base == NULL) { + Py_DECREF(bases); return NULL; + } if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { PyErr_Format(PyExc_TypeError, "type '%.100s' is not an acceptable base type", base->tp_name); + Py_DECREF(bases); return NULL; } @@ -1650,8 +1653,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) slots = Py_BuildValue("(O)", slots); else slots = PySequence_Tuple(slots); - if (slots == NULL) + if (slots == NULL) { + Py_DECREF(bases); return NULL; + } assert(PyTuple_Check(slots)); /* Are slots allowed? */ @@ -1662,6 +1667,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) "not supported for subtype of '%s'", base->tp_name); bad_slots: + Py_DECREF(bases); Py_DECREF(slots); return NULL; } @@ -1773,6 +1779,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots); if (type == NULL) { Py_XDECREF(slots); + Py_DECREF(bases); return NULL; }