diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-11-23 13:44:03 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-11-23 13:44:03 (GMT) |
commit | e3d4ec4766629c3cbcc1afb4e5c020894d5e2258 (patch) | |
tree | 42ab73cae79d5986f36230b71f647d6cfbf23877 /Lib/xml | |
parent | e9b3074cf931fee3cb91638cbdd694fa9eb9614b (diff) | |
download | cpython-e3d4ec4766629c3cbcc1afb4e5c020894d5e2258.zip cpython-e3d4ec4766629c3cbcc1afb4e5c020894d5e2258.tar.gz cpython-e3d4ec4766629c3cbcc1afb4e5c020894d5e2258.tar.bz2 |
Issue #25688: Fixed file leak in ElementTree.iterparse() raising an error.
Diffstat (limited to 'Lib/xml')
-rw-r--r-- | Lib/xml/etree/ElementTree.py | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 97eba8b..5a09b35 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1206,7 +1206,12 @@ def iterparse(source, events=None, parser=None): if not hasattr(source, "read"): source = open(source, "rb") close_source = True - return _IterParseIterator(source, events, parser, close_source) + try: + return _IterParseIterator(source, events, parser, close_source) + except: + if close_source: + source.close() + raise class XMLPullParser: @@ -1289,20 +1294,26 @@ class _IterParseIterator: self.root = self._root = None def __next__(self): - while 1: - for event in self._parser.read_events(): - return event - if self._parser._parser is None: - self.root = self._root - if self._close_file: - self._file.close() - raise StopIteration - # load event buffer - data = self._file.read(16 * 1024) - if data: - self._parser.feed(data) - else: - self._root = self._parser._close_and_return_root() + try: + while 1: + for event in self._parser.read_events(): + return event + if self._parser._parser is None: + break + # load event buffer + data = self._file.read(16 * 1024) + if data: + self._parser.feed(data) + else: + self._root = self._parser._close_and_return_root() + self.root = self._root + except: + if self._close_file: + self._file.close() + raise + if self._close_file: + self._file.close() + raise StopIteration def __iter__(self): return self |