mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Issue #25455: Fixed a crash in repr of ElementTree.Element with recursive tag.
This commit is contained in:
parent
3c317e76a2
commit
9062c261a4
3 changed files with 25 additions and 4 deletions
|
@ -18,7 +18,7 @@ import weakref
|
||||||
|
|
||||||
from itertools import product
|
from itertools import product
|
||||||
from test import support
|
from test import support
|
||||||
from test.support import TESTFN, findfile, import_fresh_module, gc_collect
|
from test.support import TESTFN, findfile, import_fresh_module, gc_collect, swap_attr
|
||||||
|
|
||||||
# pyET is the pure-Python implementation.
|
# pyET is the pure-Python implementation.
|
||||||
#
|
#
|
||||||
|
@ -1860,6 +1860,12 @@ class BadElementTest(ElementTestCase, unittest.TestCase):
|
||||||
e.extend([ET.Element('bar')])
|
e.extend([ET.Element('bar')])
|
||||||
self.assertRaises(ValueError, e.remove, X('baz'))
|
self.assertRaises(ValueError, e.remove, X('baz'))
|
||||||
|
|
||||||
|
def test_recursive_repr(self):
|
||||||
|
# Issue #25455
|
||||||
|
e = ET.Element('foo')
|
||||||
|
with swap_attr(e, 'tag', e):
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
repr(e) # Should not crash
|
||||||
|
|
||||||
class MutatingElementPath(str):
|
class MutatingElementPath(str):
|
||||||
def __new__(cls, elem, *args):
|
def __new__(cls, elem, *args):
|
||||||
|
|
|
@ -143,6 +143,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #25455: Fixed a crash in repr of ElementTree.Element with recursive tag.
|
||||||
|
|
||||||
- Issue #26556: Update expat to 2.1.1, fixes CVE-2015-1283.
|
- Issue #26556: Update expat to 2.1.1, fixes CVE-2015-1283.
|
||||||
|
|
||||||
- Fix TLS stripping vulnerability in smptlib, CVE-2016-0772. Reported by Team
|
- Fix TLS stripping vulnerability in smptlib, CVE-2016-0772. Reported by Team
|
||||||
|
|
|
@ -1582,10 +1582,23 @@ _elementtree_Element_remove_impl(ElementObject *self, PyObject *subelement)
|
||||||
static PyObject*
|
static PyObject*
|
||||||
element_repr(ElementObject* self)
|
element_repr(ElementObject* self)
|
||||||
{
|
{
|
||||||
if (self->tag)
|
int status;
|
||||||
return PyUnicode_FromFormat("<Element %R at %p>", self->tag, self);
|
|
||||||
else
|
if (self->tag == NULL)
|
||||||
return PyUnicode_FromFormat("<Element at %p>", self);
|
return PyUnicode_FromFormat("<Element at %p>", self);
|
||||||
|
|
||||||
|
status = Py_ReprEnter((PyObject *)self);
|
||||||
|
if (status == 0) {
|
||||||
|
PyObject *res;
|
||||||
|
res = PyUnicode_FromFormat("<Element %R at %p>", self->tag, self);
|
||||||
|
Py_ReprLeave((PyObject *)self);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
if (status > 0)
|
||||||
|
PyErr_Format(PyExc_RuntimeError,
|
||||||
|
"reentrant call inside %s.__repr__",
|
||||||
|
Py_TYPE(self)->tp_name);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue