]> granicus.if.org Git - python/commitdiff
bpo-35502: Fix reference leaks in ElementTree.TreeBuilder. (GH-11170)
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 18 Dec 2018 20:29:14 +0000 (22:29 +0200)
committerGitHub <noreply@github.com>
Tue, 18 Dec 2018 20:29:14 +0000 (22:29 +0200)
Lib/test/test_xml_etree_c.py
Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst [new file with mode: 0644]
Modules/_elementtree.c

index e87de6094441e1333702d114b997ee5ecf537b24..2144d203e1e95ce1cc8716154c1ca76830546580 100644 (file)
@@ -1,4 +1,5 @@
 # xml.etree test for cElementTree
+import io
 import struct
 from test import support
 from test.support import import_fresh_module
@@ -133,6 +134,26 @@ class MiscTests(unittest.TestCase):
         self.assertEqual(len(elem), 1)
         self.assertEqual(elem[0].tag, 'child')
 
+    def test_iterparse_leaks(self):
+        # Test reference leaks in TreeBuilder (issue #35502).
+        # The test is written to be executed in the hunting reference leaks
+        # mode.
+        XML = '<a></a></b>'
+        parser = cET.iterparse(io.StringIO(XML))
+        next(parser)
+        del parser
+        support.gc_collect()
+
+    def test_xmlpullparser_leaks(self):
+        # Test reference leaks in TreeBuilder (issue #35502).
+        # The test is written to be executed in the hunting reference leaks
+        # mode.
+        XML = '<a></a></b>'
+        parser = cET.XMLPullParser()
+        parser.feed(XML)
+        del parser
+        support.gc_collect()
+
 
 @unittest.skipUnless(cET, 'requires _elementtree')
 class TestAliasWorking(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst b/Misc/NEWS.d/next/Library/2018-12-14-23-56-48.bpo-35502.gLHuFS.rst
new file mode 100644 (file)
index 0000000..0fcea8d
--- /dev/null
@@ -0,0 +1,3 @@
+Fixed reference leaks in :class:`xml.etree.ElementTree.TreeBuilder` in case
+of unfinished building of the tree (in particular when an error was raised
+during parsing XML).
index 12e418d85ed5d6dacd4d013683229fca725fa094..b1a96299f24fe191433b30607d4454e094abd4c5 100644 (file)
@@ -2447,6 +2447,11 @@ _elementtree_TreeBuilder___init___impl(TreeBuilderObject *self,
 static int
 treebuilder_gc_traverse(TreeBuilderObject *self, visitproc visit, void *arg)
 {
+    Py_VISIT(self->end_ns_event_obj);
+    Py_VISIT(self->start_ns_event_obj);
+    Py_VISIT(self->end_event_obj);
+    Py_VISIT(self->start_event_obj);
+    Py_VISIT(self->events_append);
     Py_VISIT(self->root);
     Py_VISIT(self->this);
     Py_VISIT(self->last);