diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -166,22 +166,22 @@ list_join(PyObject* list) return NULL; function = PyObject_GetAttrString(joiner, "join"); - if (!function) { - Py_DECREF(joiner); + Py_DECREF(joiner); + if (!function) + return NULL; + + args = PyTuple_New(1); + if (!args) { + Py_DECREF(function); return NULL; } - args = PyTuple_New(1); - if (!args) - return NULL; - PyTuple_SET_ITEM(args, 0, list); result = PyObject_CallObject(function, args); Py_DECREF(args); /* also removes list */ Py_DECREF(function); - Py_DECREF(joiner); return result; } @@ -399,6 +399,7 @@ element_init(PyObject *self, PyObject *a return -1; if (kwds) { if (PyDict_Update(attrib, kwds) < 0) { + Py_DECREF(attrib); return -1; } } @@ -407,38 +408,34 @@ element_init(PyObject *self, PyObject *a attrib = get_attrib_from_keywords(kwds); if (!attrib) return -1; - } else { - /* no attrib arg, no kwds, so no attributes */ - Py_INCREF(Py_None); - attrib = Py_None; } self_elem = (ElementObject *)self; - if (attrib != Py_None && !is_empty_dict(attrib)) { + if (attrib != NULL && !is_empty_dict(attrib)) { if (create_extra(self_elem, attrib) < 0) { - PyObject_Del(self_elem); + Py_DECREF(attrib); return -1; } } /* We own a reference to attrib here and it's no longer needed. */ - Py_DECREF(attrib); + Py_XDECREF(attrib); /* Replace the objects already pointed to by tag, text and tail. */ tmp = self_elem->tag; + Py_INCREF(tag); self_elem->tag = tag; - Py_INCREF(tag); Py_DECREF(tmp); tmp = self_elem->text; + Py_INCREF(Py_None); self_elem->text = Py_None; + Py_DECREF(JOIN_OBJ(tmp)); + + tmp = self_elem->tail; Py_INCREF(Py_None); - Py_DECREF(JOIN_OBJ(tmp)); - - tmp = self_elem->tail; self_elem->tail = Py_None; - Py_INCREF(Py_None); Py_DECREF(JOIN_OBJ(tmp)); return 0; @@ -824,7 +821,7 @@ element_deepcopy(ElementObject* self, Py } /* add object to memo dictionary (so deepcopy won't visit it again) */ - id = PyLong_FromLong((Py_uintptr_t) self); + id = PyLong_FromSsize_t((Py_uintptr_t) self); if (!id) goto error; @@ -2081,6 +2078,7 @@ treebuilder_new(PyTypeObject *type, PyOb if (!t->stack) { Py_DECREF(t->this); Py_DECREF(t->last); + Py_DECREF((PyObject *) t); return NULL; } t->index = 0; @@ -2098,6 +2096,7 @@ treebuilder_init(PyObject *self, PyObjec static char *kwlist[] = {"element_factory", 0}; PyObject *element_factory = NULL; TreeBuilderObject *self_tb = (TreeBuilderObject *)self; + PyObject *tmp; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:TreeBuilder", kwlist, &element_factory)) { @@ -2106,8 +2105,9 @@ treebuilder_init(PyObject *self, PyObjec if (element_factory) { Py_INCREF(element_factory); - Py_XDECREF(self_tb->element_factory); + tmp = self_tb->element_factory; self_tb->element_factory = element_factory; + Py_XDECREF(tmp); } return 0; @@ -2128,17 +2128,17 @@ treebuilder_gc_traverse(TreeBuilderObjec static int treebuilder_gc_clear(TreeBuilderObject *self) { - Py_XDECREF(self->end_ns_event_obj); - Py_XDECREF(self->start_ns_event_obj); - Py_XDECREF(self->end_event_obj); - Py_XDECREF(self->start_event_obj); - Py_XDECREF(self->events); - Py_DECREF(self->stack); - Py_XDECREF(self->data); - Py_DECREF(self->last); - Py_DECREF(self->this); + Py_CLEAR(self->end_ns_event_obj); + Py_CLEAR(self->start_ns_event_obj); + Py_CLEAR(self->end_event_obj); + Py_CLEAR(self->start_event_obj); + Py_CLEAR(self->events); + Py_CLEAR(self->stack); + Py_CLEAR(self->data); + Py_CLEAR(self->last); + Py_CLEAR(self->this); Py_CLEAR(self->element_factory); - Py_XDECREF(self->root); + Py_CLEAR(self->root); return 0; } @@ -2717,13 +2717,7 @@ expat_start_handler(XMLParserObject* sel attrib_in += 2; } } else { - Py_INCREF(Py_None); - attrib = Py_None; - } - - /* If we get None, pass an empty dictionary on */ - if (attrib == Py_None) { - Py_DECREF(attrib); + /* Pass an empty dictionary on */ attrib = PyDict_New(); if (!attrib) return;