Kaydet (Commit) b3d8b594 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error.

üst 5c137669
...@@ -1198,9 +1198,14 @@ def iterparse(source, events=None, parser=None): ...@@ -1198,9 +1198,14 @@ def iterparse(source, events=None, parser=None):
if not hasattr(source, "read"): if not hasattr(source, "read"):
source = open(source, "rb") source = open(source, "rb")
close_source = True close_source = True
if not parser: try:
parser = XMLParser(target=TreeBuilder()) if not parser:
return _IterParseIterator(source, events, parser, close_source) parser = XMLParser(target=TreeBuilder())
return _IterParseIterator(source, events, parser, close_source)
except:
if close_source:
source.close()
raise
class _IterParseIterator(object): class _IterParseIterator(object):
...@@ -1252,34 +1257,40 @@ class _IterParseIterator(object): ...@@ -1252,34 +1257,40 @@ class _IterParseIterator(object):
raise ValueError("unknown event %r" % event) raise ValueError("unknown event %r" % event)
def next(self): def next(self):
while 1: try:
try: while 1:
item = self._events[self._index]
self._index += 1
return item
except IndexError:
pass
if self._error:
e = self._error
self._error = None
raise e
if self._parser is None:
self.root = self._root
if self._close_file:
self._file.close()
raise StopIteration
# load event buffer
del self._events[:]
self._index = 0
data = self._file.read(16384)
if data:
try: try:
self._parser.feed(data) item = self._events[self._index]
except SyntaxError as exc: self._index += 1
self._error = exc return item
else: except IndexError:
self._root = self._parser.close() pass
self._parser = None if self._error:
e = self._error
self._error = None
raise e
if self._parser is None:
self.root = self._root
break
# load event buffer
del self._events[:]
self._index = 0
data = self._file.read(16384)
if data:
try:
self._parser.feed(data)
except SyntaxError as exc:
self._error = exc
else:
self._root = self._parser.close()
self._parser = None
except:
if self._close_file:
self._file.close()
raise
if self._close_file:
self._file.close()
raise StopIteration
def __iter__(self): def __iter__(self):
return self return self
......
...@@ -13,8 +13,11 @@ Core and Builtins ...@@ -13,8 +13,11 @@ Core and Builtins
Library Library
------- -------
- Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error.
- Issue #23914: Fixed SystemError raised by CPickle unpickler on broken data. - Issue #23914: Fixed SystemError raised by CPickle unpickler on broken data.
What's New in Python 2.7.11? What's New in Python 2.7.11?
============================ ============================
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment