]> granicus.if.org Git - python/commitdiff
Issue #18408: Fix constructors of _elementtree.c
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 12 Jul 2013 00:05:17 +0000 (02:05 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 12 Jul 2013 00:05:17 +0000 (02:05 +0200)
* Use Py_DECREF() instead of PyObject_GC_Del() to release correctly all
  resources
* Raise MemoryError on memory allocation failure

Modules/_elementtree.c

index 7c01a602888a74e80a0b73e6fc192ec673b54345..0f63077c185e760403a4eeea797b0944f613cd1b 100644 (file)
@@ -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;
 }