Skip to content

Commit d2a75c6

Browse files
bpo-35502: Fix reference leaks in ElementTree.TreeBuilder. (GH-11170)
1 parent 60875db commit d2a75c6

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

Lib/test/test_xml_etree_c.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# xml.etree test for cElementTree
2+
import io
23
import struct
34
from test import support
45
from test.support import import_fresh_module
@@ -133,6 +134,26 @@ def test_setstate_leaks(self):
133134
self.assertEqual(len(elem), 1)
134135
self.assertEqual(elem[0].tag, 'child')
135136

137+
def test_iterparse_leaks(self):
138+
# Test reference leaks in TreeBuilder (issue #35502).
139+
# The test is written to be executed in the hunting reference leaks
140+
# mode.
141+
XML = '<a></a></b>'
142+
parser = cET.iterparse(io.StringIO(XML))
143+
next(parser)
144+
del parser
145+
support.gc_collect()
146+
147+
def test_xmlpullparser_leaks(self):
148+
# Test reference leaks in TreeBuilder (issue #35502).
149+
# The test is written to be executed in the hunting reference leaks
150+
# mode.
151+
XML = '<a></a></b>'
152+
parser = cET.XMLPullParser()
153+
parser.feed(XML)
154+
del parser
155+
support.gc_collect()
156+
136157

137158
@unittest.skipUnless(cET, 'requires _elementtree')
138159
class TestAliasWorking(unittest.TestCase):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fixed reference leaks in :class:`xml.etree.ElementTree.TreeBuilder` in case
2+
of unfinished building of the tree (in particular when an error was raised
3+
during parsing XML).

Modules/_elementtree.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2447,6 +2447,11 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
24472447
static int
24482448
treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg)
24492449
{
2450+
Py_VISIT(self->end_ns_event_obj);
2451+
Py_VISIT(self->start_ns_event_obj);
2452+
Py_VISIT(self->end_event_obj);
2453+
Py_VISIT(self->start_event_obj);
2454+
Py_VISIT(self->events_append);
24502455
Py_VISIT(self->root);
24512456
Py_VISIT(self->this);
24522457
Py_VISIT(self->last);

0 commit comments

Comments
 (0)