From 03f68b60e17b57f6f13729ff73245dbb37b30a4c Mon Sep 17 00:00:00 2001 From: Anthony Zhang Date: Wed, 22 Feb 2017 02:23:30 -0500 Subject: bpo-29110: Fix file object leak in `aifc.open` when given invalid AIFF file. (GH-162) --- Lib/aifc.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'Lib/aifc.py') diff --git a/Lib/aifc.py b/Lib/aifc.py index 692d0bfd27..380adc8d0d 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -344,9 +344,15 @@ class Aifc_read: def __init__(self, f): if isinstance(f, str): - f = builtins.open(f, 'rb') - # else, assume it is an open file object already - self.initfp(f) + file_object = builtins.open(f, 'rb') + try: + self.initfp(file_object) + except: + file_object.close() + raise + else: + # assume it is an open file object already + self.initfp(f) def __enter__(self): return self @@ -543,16 +549,19 @@ class Aifc_write: def __init__(self, f): if isinstance(f, str): - filename = f - f = builtins.open(f, 'wb') - else: - # else, assume it is an open file object already - filename = '???' - self.initfp(f) - if filename[-5:] == '.aiff': - self._aifc = 0 + file_object = builtins.open(f, 'wb') + try: + self.initfp(file_object) + except: + file_object.close() + raise + + # treat .aiff file extensions as non-compressed audio + if f.endswith('.aiff'): + self._aifc = 0 else: - self._aifc = 1 + # assume it is an open file object already + self.initfp(f) def initfp(self, file): self._file = file -- cgit v1.2.1