From: Serhiy Storchaka Date: Mon, 23 Nov 2015 13:46:36 +0000 (+0200) Subject: Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3d8b594261b06b72f22a203c747a375cb30362d;p=python Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error. --- diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 9f3e75d4a6..c6e3d396b1 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1198,9 +1198,14 @@ def iterparse(source, events=None, parser=None): if not hasattr(source, "read"): source = open(source, "rb") close_source = True - if not parser: - parser = XMLParser(target=TreeBuilder()) - return _IterParseIterator(source, events, parser, close_source) + try: + if not parser: + parser = XMLParser(target=TreeBuilder()) + return _IterParseIterator(source, events, parser, close_source) + except: + if close_source: + source.close() + raise class _IterParseIterator(object): @@ -1252,34 +1257,40 @@ class _IterParseIterator(object): raise ValueError("unknown event %r" % event) def next(self): - while 1: - try: - 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: + while 1: try: - self._parser.feed(data) - except SyntaxError as exc: - self._error = exc - else: - self._root = self._parser.close() - self._parser = None + 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 + 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): return self diff --git a/Misc/NEWS b/Misc/NEWS index ec5c378314..25100899cb 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,8 +13,11 @@ Core and Builtins Library ------- +- Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error. + - Issue #23914: Fixed SystemError raised by CPickle unpickler on broken data. + What's New in Python 2.7.11? ============================