Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 496c428

Browse files
bpo-43292: Fix file leak in ET.iterparse() when not exhausted (GH-31696)
Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent b748a36 commit 496c428

File tree

4 files changed

+20
-7
lines changed

4 files changed

+20
-7
lines changed

Lib/test/test_xml_etree.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,14 @@ def test_iterparse(self):
658658
'junk after document element: line 1, column 12')
659659
del cm, it
660660

661+
# Not exhausting the iterator still closes the resource (bpo-43292)
662+
with warnings_helper.check_no_resource_warning(self):
663+
it = iterparse(TESTFN)
664+
del it
665+
666+
with self.assertRaises(FileNotFoundError):
667+
iterparse("nonexistent")
668+
661669
def test_writefile(self):
662670
elem = ET.Element("tag")
663671
elem.text = "text"

Lib/xml/etree/ElementTree.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,8 +1244,14 @@ def iterparse(source, events=None, parser=None):
12441244
# Use the internal, undocumented _parser argument for now; When the
12451245
# parser argument of iterparse is removed, this can be killed.
12461246
pullparser = XMLPullParser(events=events, _parser=parser)
1247-
def iterator():
1247+
1248+
def iterator(source):
1249+
close_source = False
12481250
try:
1251+
if not hasattr(source, "read"):
1252+
source = open(source, "rb")
1253+
close_source = True
1254+
yield None
12491255
while True:
12501256
yield from pullparser.read_events()
12511257
# load event buffer
@@ -1261,16 +1267,12 @@ def iterator():
12611267
source.close()
12621268

12631269
class IterParseIterator(collections.abc.Iterator):
1264-
__next__ = iterator().__next__
1270+
__next__ = iterator(source).__next__
12651271
it = IterParseIterator()
12661272
it.root = None
12671273
del iterator, IterParseIterator
12681274

1269-
close_source = False
1270-
if not hasattr(source, "read"):
1271-
source = open(source, "rb")
1272-
close_source = True
1273-
1275+
next(it)
12741276
return it
12751277

12761278

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,6 +1879,7 @@ Wojtek Walczak
18791879
Charles Waldman
18801880
Richard Walker
18811881
Larry Wall
1882+
Jacob Walls
18821883
Kevin Walzer
18831884
Rodrigo Steinmuller Wanderley
18841885
Dingyuan Wang
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed a file leak in :func:`xml.etree.ElementTree.iterparse` when the
2+
iterator is not exhausted. Patch by Jacob Walls.

0 commit comments

Comments
 (0)