From: Michael W. Hudson Date: Fri, 8 Aug 2003 13:57:22 +0000 (+0000) Subject: /* XXX From here until type is allocated, "return NULL" leaks bases! */ X-Git-Tag: v2.4a1~1775 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a6a277d8316973ca3f546e5111430a8c4ee07181;p=python /* 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. --- diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 2a7df8aa63..5c0f73aef6 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; }