Skip to content

Commit ae55e9c

Browse files
Fix a UAF in
`Element.findtext()`
1 parent d61fcf8 commit ae55e9c

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

Lib/test/test_xml_etree.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3258,6 +3258,16 @@ def test_findtext_with_mutating(self):
32583258
e.extend([ET.Element('bar')])
32593259
e.findtext(cls(e, 'x'))
32603260

3261+
def test_findtext_with_mutating_non_none_text(self):
3262+
for cls in [MutationDeleteElementPath, MutationClearElementPath]:
3263+
with self.subTest(cls):
3264+
e = ET.Element('foo')
3265+
child = ET.Element('bar')
3266+
child.text = str(object())
3267+
e.append(child)
3268+
del child
3269+
repr(e.findtext(cls(e, 'x')))
3270+
32613271
def test_findtext_with_error(self):
32623272
e = ET.Element('foo')
32633273
e.extend([ET.Element('bar')])
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
:mod:`xml.etree.ElementTree`: Fix a use-after-free in
2+
:meth:`Element.findtext <xml.etree.ElementTree.Element.findtext>` when the
3+
tag to find implements an :meth:`~object.__eq__` method that drops every
4+
other reference to a matching element.

Modules/_elementtree.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,12 +1347,12 @@ _elementtree_Element_findtext_impl(ElementObject *self, PyTypeObject *cls,
13471347
int rc = PyObject_RichCompareBool(tag, path, Py_EQ);
13481348
Py_DECREF(tag);
13491349
if (rc > 0) {
1350-
PyObject *text = element_get_text((ElementObject *)item);
1350+
PyObject *text = Py_XNewRef(element_get_text((ElementObject *)item));
13511351
Py_DECREF(item);
13521352
if (text == Py_None) {
1353+
Py_DECREF(text);
13531354
return Py_GetConstant(Py_CONSTANT_EMPTY_STR);
13541355
}
1355-
Py_XINCREF(text);
13561356
return text;
13571357
}
13581358
Py_DECREF(item);

0 commit comments

Comments
 (0)