mirror of
https://github.com/python/cpython.git
synced 2025-07-23 19:25:40 +00:00
bpo-29110: Fix file object leak in aifc.open
when given invalid AIFF file. (GH-162)
This commit is contained in:
parent
0899b98095
commit
03f68b60e1
3 changed files with 33 additions and 13 deletions
29
Lib/aifc.py
29
Lib/aifc.py
|
@ -344,8 +344,14 @@ class Aifc_read:
|
||||||
|
|
||||||
def __init__(self, f):
|
def __init__(self, f):
|
||||||
if isinstance(f, str):
|
if isinstance(f, str):
|
||||||
f = builtins.open(f, 'rb')
|
file_object = builtins.open(f, 'rb')
|
||||||
# else, assume it is an open file object already
|
try:
|
||||||
|
self.initfp(file_object)
|
||||||
|
except:
|
||||||
|
file_object.close()
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
# assume it is an open file object already
|
||||||
self.initfp(f)
|
self.initfp(f)
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
@ -543,16 +549,19 @@ class Aifc_write:
|
||||||
|
|
||||||
def __init__(self, f):
|
def __init__(self, f):
|
||||||
if isinstance(f, str):
|
if isinstance(f, str):
|
||||||
filename = f
|
file_object = builtins.open(f, 'wb')
|
||||||
f = builtins.open(f, 'wb')
|
try:
|
||||||
else:
|
self.initfp(file_object)
|
||||||
# else, assume it is an open file object already
|
except:
|
||||||
filename = '???'
|
file_object.close()
|
||||||
self.initfp(f)
|
raise
|
||||||
if filename[-5:] == '.aiff':
|
|
||||||
|
# treat .aiff file extensions as non-compressed audio
|
||||||
|
if f.endswith('.aiff'):
|
||||||
self._aifc = 0
|
self._aifc = 0
|
||||||
else:
|
else:
|
||||||
self._aifc = 1
|
# assume it is an open file object already
|
||||||
|
self.initfp(f)
|
||||||
|
|
||||||
def initfp(self, file):
|
def initfp(self, file):
|
||||||
self._file = file
|
self._file = file
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from test.support import findfile, TESTFN, unlink
|
from test.support import check_no_resource_warning, findfile, TESTFN, unlink
|
||||||
import unittest
|
import unittest
|
||||||
from test import audiotests
|
from test import audiotests
|
||||||
from audioop import byteswap
|
from audioop import byteswap
|
||||||
|
@ -149,6 +149,14 @@ class AifcMiscTest(audiotests.AudioTests, unittest.TestCase):
|
||||||
#This file contains chunk types aifc doesn't recognize.
|
#This file contains chunk types aifc doesn't recognize.
|
||||||
self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif'))
|
self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif'))
|
||||||
|
|
||||||
|
def test_close_opened_files_on_error(self):
|
||||||
|
non_aifc_file = findfile('pluck-pcm8.wav', subdir='audiodata')
|
||||||
|
with check_no_resource_warning(self):
|
||||||
|
with self.assertRaises(aifc.Error):
|
||||||
|
# Try opening a non-AIFC file, with the expectation that
|
||||||
|
# `aifc.open` will fail (without raising a ResourceWarning)
|
||||||
|
f = self.f = aifc.open(non_aifc_file, 'rb')
|
||||||
|
|
||||||
def test_params_added(self):
|
def test_params_added(self):
|
||||||
f = self.f = aifc.open(TESTFN, 'wb')
|
f = self.f = aifc.open(TESTFN, 'wb')
|
||||||
f.aiff()
|
f.aiff()
|
||||||
|
|
|
@ -242,6 +242,9 @@ Library
|
||||||
- bpo-29532: Altering a kwarg dictionary passed to functools.partial()
|
- bpo-29532: Altering a kwarg dictionary passed to functools.partial()
|
||||||
no longer affects a partial object after creation.
|
no longer affects a partial object after creation.
|
||||||
|
|
||||||
|
- bpo-29110: Fix file object leak in aifc.open() when file is given as a
|
||||||
|
filesystem path and is not in valid AIFF format. Patch by Anthony Zhang.
|
||||||
|
|
||||||
- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from
|
- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from
|
||||||
the platform about whether generated UUIDs are generated with a
|
the platform about whether generated UUIDs are generated with a
|
||||||
multiprocessing safe method.
|
multiprocessing safe method.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue