From: Raymond Hettinger Date: Sat, 28 Jun 2003 20:04:25 +0000 (+0000) Subject: SF patch 703666: Several objects don't decref tmp on failure in subtype_new X-Git-Tag: v2.3c1~283 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f466793fcc6e2234f4843bd6a04625f1fac96132;p=python SF patch 703666: Several objects don't decref tmp on failure in subtype_new Submitted By: Christopher A. Craig Fillin some missing decrefs. --- diff --git a/Objects/floatobject.c b/Objects/floatobject.c index f36479f978..9ed53e2574 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -751,8 +751,10 @@ float_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; assert(PyFloat_CheckExact(tmp)); new = type->tp_alloc(type, 0); - if (new == NULL) + if (new == NULL) { + Py_DECREF(tmp); return NULL; + } ((PyFloatObject *)new)->ob_fval = ((PyFloatObject *)tmp)->ob_fval; Py_DECREF(tmp); return new; diff --git a/Objects/intobject.c b/Objects/intobject.c index 4b5dc55632..a3df3bab61 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -958,8 +958,10 @@ int_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } new = type->tp_alloc(type, 0); - if (new == NULL) + if (new == NULL) { + Py_DECREF(tmp); return NULL; + } ((PyIntObject *)new)->ob_ival = ival; Py_DECREF(tmp); return new; diff --git a/Objects/longobject.c b/Objects/longobject.c index 52c30c2be8..f246bd2320 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -2794,8 +2794,10 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (n < 0) n = -n; new = (PyLongObject *)type->tp_alloc(type, n); - if (new == NULL) + if (new == NULL) { + Py_DECREF(tmp); return NULL; + } assert(PyLong_Check(new)); new->ob_size = tmp->ob_size; for (i = 0; i < n; i++) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 94c67c84df..af427dd118 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6688,12 +6688,15 @@ unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; assert(PyUnicode_Check(tmp)); pnew = (PyUnicodeObject *) type->tp_alloc(type, n = tmp->length); - if (pnew == NULL) + if (pnew == NULL) { + Py_DECREF(tmp); return NULL; + } pnew->str = PyMem_NEW(Py_UNICODE, n+1); if (pnew->str == NULL) { _Py_ForgetReference((PyObject *)pnew); PyObject_Del(pnew); + Py_DECREF(tmp); return PyErr_NoMemory(); } Py_UNICODE_COPY(pnew->str, tmp->str, n+1);