From 1f7586eeb921d4b1116823b2aea752aaee1329ce Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 12 Jun 2016 10:06:32 +0300 Subject: Issue #25455: Fixed a crash in repr of cElementTree.Element with recursive tag. --- Misc/NEWS | 2 ++ Modules/_elementtree.c | 28 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 55f44bf..b7785e5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,8 @@ Core and Builtins Library ------- +- Issue #25455: Fixed a crash in repr of cElementTree.Element with recursive tag. + Documentation ------------- diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 6f628a5..df97b5e 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1222,18 +1222,28 @@ element_remove(ElementObject* self, PyObject* args) static PyObject* element_repr(ElementObject* self) { - PyObject *repr, *tag; + int status; - tag = PyObject_Repr(self->tag); - if (!tag) - return NULL; + if (self->tag == NULL) + return PyUnicode_FromFormat("", self); - repr = PyString_FromFormat("", - PyString_AS_STRING(tag), self); - - Py_DECREF(tag); + status = Py_ReprEnter((PyObject *)self); + if (status == 0) { + PyObject *repr, *tag; + tag = PyObject_Repr(self->tag); + if (!tag) + return NULL; - return repr; + repr = PyString_FromFormat("", + PyString_AS_STRING(tag), self); + Py_DECREF(tag); + return repr; + } + if (status > 0) + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + return NULL; } static PyObject* -- cgit v0.12