From: Victor Stinner Date: Fri, 12 Jul 2013 00:05:17 +0000 (+0200) Subject: Issue #18408: Fix constructors of _elementtree.c X-Git-Tag: v3.4.0a1~234 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d917dcbe5e855ae30eca455d38bec2bf6354dbdf;p=python Issue #18408: Fix constructors of _elementtree.c * Use Py_DECREF() instead of PyObject_GC_Del() to release correctly all resources * Raise MemoryError on memory allocation failure --- diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 7c01a60288..0f63077c18 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -237,15 +237,16 @@ create_new_element(PyObject* tag, PyObject* attrib) self->weakreflist = NULL; + ALLOC(sizeof(ElementObject), "create element"); + PyObject_GC_Track(self); + if (attrib != Py_None && !is_empty_dict(attrib)) { if (create_extra(self, attrib) < 0) { - PyObject_GC_Del(self); + Py_DECREF(self); return NULL; } } - ALLOC(sizeof(ElementObject), "create element"); - PyObject_GC_Track(self); return (PyObject*) self; } @@ -2122,14 +2123,6 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext) it = PyObject_GC_New(ElementIterObject, &ElementIter_Type); if (!it) return NULL; - if (!(it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)))) { - PyObject_GC_Del(it); - return NULL; - } - - it->parent_stack->parent = NULL; - it->parent_stack->child_index = 0; - it->parent_stack->next = NULL; if (PyUnicode_Check(tag)) star = PyUnicode_FromString("*"); @@ -2147,8 +2140,18 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext) Py_INCREF(self); it->root_element = self; - PyObject_GC_Track(it); + + it->parent_stack = PyObject_Malloc(sizeof(ParentLocator)); + if (it->parent_stack == NULL) { + Py_DECREF(it); + PyErr_NoMemory(); + return NULL; + } + it->parent_stack->parent = NULL; + it->parent_stack->child_index = 0; + it->parent_stack->next = NULL; + return (PyObject *)it; }