Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit27ecbd5

Browse files
miss-islingtonjacobtylerwalls
authored andcommitted
[3.9] bpo-43292: Fix file leak inET.iterparse() when not exhausted (pythonGH-31696) (pythonGH-31720)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>(cherry picked from commit496c428)Co-authored-by: Jacob Walls <jacobtylerwalls@gmail.com>
1 parentb788a2f commit27ecbd5

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
@@ -640,6 +640,14 @@ def test_iterparse(self):
640640
'junk after document element: line 1, column 12')
641641
delcm,it
642642

643+
# Not exhausting the iterator still closes the resource (bpo-43292)
644+
withsupport.check_no_resource_warning(self):
645+
it=iterparse(TESTFN)
646+
delit
647+
648+
withself.assertRaises(FileNotFoundError):
649+
iterparse("nonexistent")
650+
643651
deftest_writefile(self):
644652
elem=ET.Element("tag")
645653
elem.text="text"

‎Lib/xml/etree/ElementTree.py‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,8 +1248,14 @@ def iterparse(source, events=None, parser=None):
12481248
# Use the internal, undocumented _parser argument for now; When the
12491249
# parser argument of iterparse is removed, this can be killed.
12501250
pullparser=XMLPullParser(events=events,_parser=parser)
1251-
defiterator():
1251+
1252+
defiterator(source):
1253+
close_source=False
12521254
try:
1255+
ifnothasattr(source,"read"):
1256+
source=open(source,"rb")
1257+
close_source=True
1258+
yieldNone
12531259
whileTrue:
12541260
yieldfrompullparser.read_events()
12551261
# load event buffer
@@ -1265,16 +1271,12 @@ def iterator():
12651271
source.close()
12661272

12671273
classIterParseIterator(collections.abc.Iterator):
1268-
__next__=iterator().__next__
1274+
__next__=iterator(source).__next__
12691275
it=IterParseIterator()
12701276
it.root=None
12711277
deliterator,IterParseIterator
12721278

1273-
close_source=False
1274-
ifnothasattr(source,"read"):
1275-
source=open(source,"rb")
1276-
close_source=True
1277-
1279+
next(it)
12781280
returnit
12791281

12801282

‎Misc/ACKS‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,6 +1836,7 @@ Wojtek Walczak
18361836
Charles Waldman
18371837
Richard Walker
18381838
Larry Wall
1839+
Jacob Walls
18391840
Kevin Walzer
18401841
Rodrigo Steinmuller Wanderley
18411842
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)

[8]ページ先頭

©2009-2025 Movatter.jp