Skip to content

Commit

Permalink
bpo-43292: Fix file leak in ET.iterparse() when not exhausted (GH-3…
Browse files Browse the repository at this point in the history
…1696)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
  • Loading branch information
jacobtylerwalls and serhiy-storchaka committed Mar 7, 2022
1 parent b748a36 commit 496c428
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 7 deletions.
8 changes: 8 additions & 0 deletions Lib/test/test_xml_etree.py
Expand Up @@ -658,6 +658,14 @@ def test_iterparse(self):
'junk after document element: line 1, column 12')
del cm, it

# Not exhausting the iterator still closes the resource (bpo-43292)
with warnings_helper.check_no_resource_warning(self):
it = iterparse(TESTFN)
del it

with self.assertRaises(FileNotFoundError):
iterparse("nonexistent")

def test_writefile(self):
elem = ET.Element("tag")
elem.text = "text"
Expand Down
16 changes: 9 additions & 7 deletions Lib/xml/etree/ElementTree.py
Expand Up @@ -1244,8 +1244,14 @@ def iterparse(source, events=None, parser=None):
# Use the internal, undocumented _parser argument for now; When the
# parser argument of iterparse is removed, this can be killed.
pullparser = XMLPullParser(events=events, _parser=parser)
def iterator():

def iterator(source):
close_source = False
try:
if not hasattr(source, "read"):
source = open(source, "rb")
close_source = True
yield None
while True:
yield from pullparser.read_events()
# load event buffer
Expand All @@ -1261,16 +1267,12 @@ def iterator():
source.close()

class IterParseIterator(collections.abc.Iterator):
__next__ = iterator().__next__
__next__ = iterator(source).__next__
it = IterParseIterator()
it.root = None
del iterator, IterParseIterator

close_source = False
if not hasattr(source, "read"):
source = open(source, "rb")
close_source = True

next(it)
return it


Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Expand Up @@ -1879,6 +1879,7 @@ Wojtek Walczak
Charles Waldman
Richard Walker
Larry Wall
Jacob Walls
Kevin Walzer
Rodrigo Steinmuller Wanderley
Dingyuan Wang
Expand Down
@@ -0,0 +1,2 @@
Fixed a file leak in :func:`xml.etree.ElementTree.iterparse` when the
iterator is not exhausted. Patch by Jacob Walls.

0 comments on commit 496c428

Please sign in to comment.