FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Issue #25688: Fixed file leak in ElementTree.iterparse() raising an e… · python/cpython@6f988b5 · GitHub

Repository navigation

Commit 6f988b5

Browse files
Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error.
2 parents 4409c6c + e3d4ec4 commit 6f988b5

3 files changed

Lines changed: 55 additions & 17 deletions

File tree

‎Lib/test/test_xml_etree.py‎

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,11 +561,21 @@ def test_iterparse(self):
561561
self.assertEqual(res, ['start-ns', 'end-ns'])
562562

563563
events = ("start", "end", "bogus")
564-
with self.assertRaises(ValueError) as cm:
565-
with open(SIMPLE_XMLFILE, "rb") as f:
564+
with open(SIMPLE_XMLFILE, "rb") as f:
565+
with self.assertRaises(ValueError) as cm:
566566
iterparse(f, events)
567+
self.assertFalse(f.closed)
567568
self.assertEqual(str(cm.exception), "unknown event 'bogus'")
568569

570+
with warnings.catch_warnings(record=True) as w:
571+
warnings.filterwarnings("always", category=ResourceWarning)
572+
with self.assertRaises(ValueError) as cm:
573+
iterparse(SIMPLE_XMLFILE, events)
574+
self.assertEqual(str(cm.exception), "unknown event 'bogus'")
575+
del cm
576+
support.gc_collect()
577+
self.assertEqual(w, [])
578+
569579
source = io.BytesIO(
570580
b"<?xml version='1.0' encoding='iso-8859-1'?>\n"
571581
b"<body xmlns='http://&#233;ffbot.org/ns'\n"
@@ -586,6 +596,21 @@ def test_iterparse(self):
586596
self.assertEqual(str(cm.exception),
587597
'junk after document element: line 1, column 12')
588598

599+
with open(TESTFN, "wb") as f:
600+
f.write(b"<document />junk")
601+
it = iterparse(TESTFN)
602+
action, elem = next(it)
603+
self.assertEqual((action, elem.tag), ('end', 'document'))
604+
with warnings.catch_warnings(record=True) as w:
605+
warnings.filterwarnings("always", category=ResourceWarning)
606+
with self.assertRaises(ET.ParseError) as cm:
607+
next(it)
608+
self.assertEqual(str(cm.exception),
609+
'junk after document element: line 1, column 12')
610+
del cm, it
611+
support.gc_collect()
612+
self.assertEqual(w, [])
613+
589614
def test_writefile(self):
590615
elem = ET.Element("tag")
591616
elem.text = "text"

‎Lib/xml/etree/ElementTree.py‎

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,12 @@ def iterparse(source, events=None, parser=None):
12021202
if not hasattr(source, "read"):
12031203
source = open(source, "rb")
12041204
close_source = True
1205-
return _IterParseIterator(source, events, parser, close_source)
1205+
try:
1206+
return _IterParseIterator(source, events, parser, close_source)
1207+
except:
1208+
if close_source:
1209+
source.close()
1210+
raise
12061211

12071212

12081213
class XMLPullParser:
@@ -1285,20 +1290,26 @@ def __init__(self, source, events, parser, close_source=False):
12851290
self.root = self._root = None
12861291

12871292
def __next__(self):
1288-
while 1:
1289-
for event in self._parser.read_events():
1290-
return event
1291-
if self._parser._parser is None:
1292-
self.root = self._root
1293-
if self._close_file:
1294-
self._file.close()
1295-
raise StopIteration
1296-
# load event buffer
1297-
data = self._file.read(16 * 1024)
1298-
if data:
1299-
self._parser.feed(data)
1300-
else:
1301-
self._root = self._parser._close_and_return_root()
1293+
try:
1294+
while 1:
1295+
for event in self._parser.read_events():
1296+
return event
1297+
if self._parser._parser is None:
1298+
break
1299+
# load event buffer
1300+
data = self._file.read(16 * 1024)
1301+
if data:
1302+
self._parser.feed(data)
1303+
else:
1304+
self._root = self._parser._close_and_return_root()
1305+
self.root = self._root
1306+
except:
1307+
if self._close_file:
1308+
self._file.close()
1309+
raise
1310+
if self._close_file:
1311+
self._file.close()
1312+
raise StopIteration
13021313

13031314
def __iter__(self):
13041315
return self

‎Misc/NEWS‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Core and Builtins
1313
Library
1414
-------
1515

16+
- Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error.
17+
1618
- Issue #23914: Fixed SystemError raised by unpickler on broken pickle data.
1719

1820
- Issue #25691: Fixed crash on deleting ElementTree.Element attributes.

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL