From: R. David Murray Date: Wed, 29 Apr 2009 13:17:37 +0000 (+0000) Subject: Fix issue 2245. aifc now skips any chunk type it doesn't actually X-Git-Tag: v2.7a1~1344 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25b4add5b0569e626afd8b3b5b7dd4a7551372c9;p=thirdparty%2FPython%2Fcpython.git Fix issue 2245. aifc now skips any chunk type it doesn't actually process instead of throwing errors for anything not in an explicit skip list. This is per this spec: http://www.cnpbagwell.com/aiff-c.txt. Spec reference and test sound file provided by Santiago Peresón, fix based on patch by Hiroaki Kawai. --- diff --git a/Lib/aifc.py b/Lib/aifc.py index f663dd67d2e7..8e4f864495d4 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -144,9 +144,6 @@ class Error(Exception): _AIFC_version = 0xA2805140L # Version 1 of AIFF-C -_skiplist = 'COMT', 'INST', 'MIDI', 'AESD', \ - 'APPL', 'NAME', 'AUTH', '(c) ', 'ANNO' - def _read_long(file): try: return struct.unpack('>l', file.read(4))[0] @@ -314,10 +311,6 @@ class Aifc_read: self._version = _read_ulong(chunk) elif chunkname == 'MARK': self._readmark(chunk) - elif chunkname in _skiplist: - pass - else: - raise Error, 'unrecognized chunk type '+chunk.chunkname chunk.skip() if not self._comm_chunk_read or not self._ssnd_chunk: raise Error, 'COMM chunk and/or SSND chunk missing' diff --git a/Lib/test/Sine-1000Hz-300ms.aif b/Lib/test/Sine-1000Hz-300ms.aif new file mode 100644 index 000000000000..bf08f5ce8594 Binary files /dev/null and b/Lib/test/Sine-1000Hz-300ms.aif differ diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py new file mode 100644 index 000000000000..58380e0e9dbb --- /dev/null +++ b/Lib/test/test_aifc.py @@ -0,0 +1,24 @@ +from test.test_support import findfile, run_unittest +import unittest + +import aifc + + +class AIFCTest(unittest.TestCase): + + def setUp(self): + self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') + + def test_skipunknown(self): + #Issue 2245 + #This file contains chunk types aifc doesn't recognize. + f = aifc.open(self.sndfilepath) + f.close() + + +def test_main(): + run_unittest(AIFCTest) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py index 48cbcd60f814..cef155bb2aec 100644 --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -11,7 +11,6 @@ class TestUntestedModules(unittest.TestCase): with warnings.catch_warnings(): warnings.simplefilter("ignore") import CGIHTTPServer - import aifc import audiodev import bdb import cgitb diff --git a/Misc/ACKS b/Misc/ACKS index 4b409e1fa2f6..d650b674c2dc 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -370,6 +370,7 @@ Tamito Kajiyama Peter van Kampen Jacob Kaplan-Moss Lou Kates +Hiroaki Kawai Sebastien Keim Robert Kern Randall Kern @@ -541,6 +542,7 @@ Randy Pausch Samuele Pedroni Marcel van der Peijl Steven Pemberton +Santiago Peresón Mark Perrego Trevor Perrin Tim Peters diff --git a/Misc/NEWS b/Misc/NEWS index efd57d463226..7a8cb910803f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -255,6 +255,8 @@ Core and Builtins Library ------- +- Issue #2245: aifc now skips chunk types it doesn't recognize, per spec. + - Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive anymore.