From 88944a44aa84b0f3674939019b1befbc7a9dc874 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 9 Mar 2020 14:37:08 +0200 Subject: bpo-39903: Fix double decref in _elementtree.Element.__getstate__ (GH-18850) --- Modules/_elementtree.c | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index cc06824..0d3112a 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -950,8 +950,8 @@ static PyObject * _elementtree_Element___getstate___impl(ElementObject *self) /*[clinic end generated code: output=37279aeeb6bb5b04 input=f0d16d7ec2f7adc1]*/ { - Py_ssize_t i, noattrib; - PyObject *instancedict = NULL, *children; + Py_ssize_t i; + PyObject *children, *attrib; /* Build a list of children. */ children = PyList_New(self->extra ? self->extra->length : 0); @@ -963,33 +963,24 @@ _elementtree_Element___getstate___impl(ElementObject *self) PyList_SET_ITEM(children, i, child); } - /* Construct the state object. */ - noattrib = (self->extra == NULL || self->extra->attrib == Py_None); - if (noattrib) - instancedict = Py_BuildValue("{sOsOs{}sOsO}", - PICKLED_TAG, self->tag, - PICKLED_CHILDREN, children, - PICKLED_ATTRIB, - PICKLED_TEXT, JOIN_OBJ(self->text), - PICKLED_TAIL, JOIN_OBJ(self->tail)); - else - instancedict = Py_BuildValue("{sOsOsOsOsO}", - PICKLED_TAG, self->tag, - PICKLED_CHILDREN, children, - PICKLED_ATTRIB, self->extra->attrib, - PICKLED_TEXT, JOIN_OBJ(self->text), - PICKLED_TAIL, JOIN_OBJ(self->tail)); - if (instancedict) { - Py_DECREF(children); - return instancedict; + if (self->extra && self->extra->attrib != Py_None) { + attrib = self->extra->attrib; + Py_INCREF(attrib); } else { - for (i = 0; i < PyList_GET_SIZE(children); i++) - Py_DECREF(PyList_GET_ITEM(children, i)); - Py_DECREF(children); - - return NULL; + attrib = PyDict_New(); + if (!attrib) { + Py_DECREF(children); + return NULL; + } } + + return Py_BuildValue("{sOsNsNsOsO}", + PICKLED_TAG, self->tag, + PICKLED_CHILDREN, children, + PICKLED_ATTRIB, attrib, + PICKLED_TEXT, JOIN_OBJ(self->text), + PICKLED_TAIL, JOIN_OBJ(self->tail)); } static PyObject * -- cgit v0.12