Commit 0f3735b8 authored by Eli Bendersky's avatar Eli Bendersky

Close #16076: fix refleak in pickling of Element.

Thanks to Ezio Melotti and Daniel Shahaf for the patch.
parents a6ebb2d7 b8f6dc85
...@@ -859,8 +859,10 @@ element_getstate(ElementObject *self) ...@@ -859,8 +859,10 @@ element_getstate(ElementObject *self)
PICKLED_ATTRIB, self->extra->attrib, PICKLED_ATTRIB, self->extra->attrib,
PICKLED_TEXT, self->text, PICKLED_TEXT, self->text,
PICKLED_TAIL, self->tail); PICKLED_TAIL, self->tail);
if (instancedict) if (instancedict) {
Py_DECREF(children);
return instancedict; return instancedict;
}
else { else {
for (i = 0; i < PyList_GET_SIZE(children); i++) for (i = 0; i < PyList_GET_SIZE(children); i++)
Py_DECREF(PyList_GET_ITEM(children, i)); Py_DECREF(PyList_GET_ITEM(children, i));
...@@ -884,25 +886,17 @@ element_setstate_from_attributes(ElementObject *self, ...@@ -884,25 +886,17 @@ element_setstate_from_attributes(ElementObject *self,
PyErr_SetString(PyExc_TypeError, "tag may not be NULL"); PyErr_SetString(PyExc_TypeError, "tag may not be NULL");
return NULL; return NULL;
} }
if (!text) {
Py_INCREF(Py_None);
text = Py_None;
}
if (!tail) {
Py_INCREF(Py_None);
tail = Py_None;
}
Py_CLEAR(self->tag); Py_CLEAR(self->tag);
self->tag = tag; self->tag = tag;
Py_INCREF(self->tag); Py_INCREF(self->tag);
Py_CLEAR(self->text); Py_CLEAR(self->text);
self->text = text; self->text = text ? text : Py_None;
Py_INCREF(self->text); Py_INCREF(self->text);
Py_CLEAR(self->tail); Py_CLEAR(self->tail);
self->tail = tail; self->tail = tail ? tail : Py_None;
Py_INCREF(self->tail); Py_INCREF(self->tail);
/* Handle ATTRIB and CHILDREN. */ /* Handle ATTRIB and CHILDREN. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment