Issue #25455: Fixed a crash in repr of cElementTree.Element with recursive tag.
diff --git a/Misc/NEWS b/Misc/NEWS
index 55f44bf..b7785e5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,8 @@
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 @@
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("<Element at %p>", self);
- repr = PyString_FromFormat("<Element %s at %p>",
- PyString_AS_STRING(tag), self);
+ status = Py_ReprEnter((PyObject *)self);
+ if (status == 0) {
+ PyObject *repr, *tag;
+ tag = PyObject_Repr(self->tag);
+ if (!tag)
+ return NULL;
- Py_DECREF(tag);
-
- return repr;
+ repr = PyString_FromFormat("<Element %s at %p>",
+ 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*