(original) (raw)
changeset: 84568:0877e17fa25e user: Victor Stinner victor.stinner@gmail.com date: Thu Jul 11 23:08:39 2013 +0200 files: Modules/_elementtree.c description: Issue #18408: Different fixes in _elementtree.c to handle correctly MemoryError * create_new_element() initializes all attributes before handling errors, to fix a crash in the destructor * create_new_element() calls PyObject_GC_Del() on error, instead of PyObject_Del(), because the object was created by PyObject_GC_New() * subelement() now handles create_new_element() failure * element_getattro() now handles element_get_text() failure * makeuniversal() now handles PyBytes_FromStringAndSize() failure diff -r e1b398d0decb -r 0877e17fa25e Modules/_elementtree.c --- a/Modules/_elementtree.c Thu Jul 11 23:05:03 2013 +0200 +++ b/Modules/_elementtree.c Thu Jul 11 23:08:39 2013 +0200 @@ -224,13 +224,6 @@ return NULL; self->extra = NULL; - if (attrib != Py_None && !is_empty_dict(attrib)) { - if (create_extra(self, attrib) < 0) { - PyObject_Del(self); - return NULL; - } - } - Py_INCREF(tag); self->tag = tag; @@ -242,6 +235,13 @@ self->weakreflist = NULL; + if (attrib != Py_None && !is_empty_dict(attrib)) { + if (create_extra(self, attrib) < 0) { + PyObject_GC_Del(self); + return NULL; + } + } + ALLOC(sizeof(ElementObject), "create element"); PyObject_GC_Track(self); return (PyObject*) self; @@ -530,6 +530,8 @@ elem = create_new_element(tag, attrib); Py_DECREF(attrib); + if (elem == NULL) + return NULL; if (element_add_subelement(parent, elem) < 0) { Py_DECREF(elem); @@ -1748,7 +1750,7 @@ return res; } else if (strcmp(name, "text") == 0) { res = element_get_text(self); - Py_INCREF(res); + Py_XINCREF(res); return res; } @@ -2726,6 +2728,10 @@ if (i != size) { /* convert to universal name */ tag = PyBytes_FromStringAndSize(NULL, size+1); + if (tag == NULL) { + Py_DECREF(key); + return NULL; + } p = PyBytes_AS_STRING(tag); p[0] = '{'; memcpy(p+1, string, size); /victor.stinner@gmail.com