diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-01-28 21:01:59 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-01-28 21:01:59 (GMT) |
commit | 75ff65ef963e7127cdb02d48cf0d1fea352a00da (patch) | |
tree | 5a6de16d28d7c1b241ae78f99a03e10b0eb0ee9c | |
parent | eba63c4203322af73fd2a926bd20edc495717577 (diff) | |
download | cpython-75ff65ef963e7127cdb02d48cf0d1fea352a00da.zip cpython-75ff65ef963e7127cdb02d48cf0d1fea352a00da.tar.gz cpython-75ff65ef963e7127cdb02d48cf0d1fea352a00da.tar.bz2 |
Issue #13806: The size check in audioop decompression functions was too strict and could reject valid compressed data.
Patch by Oleg Plakhotnyuk.
-rw-r--r-- | Lib/test/test_audioop.py | 25 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/audioop.c | 6 |
3 files changed, 25 insertions, 9 deletions
diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py index 308c3e3..ff60a7d 100644 --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -21,9 +21,9 @@ def gendata4(): data = [gendata1(), gendata2(), gendata4()] INVALID_DATA = [ - ('abc', 0), - ('abc', 2), - ('abc', 4), + (b'abc', 0), + (b'abc', 2), + (b'abc', 4), ] @@ -94,7 +94,9 @@ class TestAudioop(unittest.TestCase): def test_adpcm2lin(self): # Very cursory test - self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0\0\0\0', (0,0))) + self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0' * 4, (0,0))) + self.assertEqual(audioop.adpcm2lin(b'\0\0', 2, None), (b'\0' * 8, (0,0))) + self.assertEqual(audioop.adpcm2lin(b'\0\0', 4, None), (b'\0' * 16, (0,0))) def test_lin2adpcm(self): # Very cursory test @@ -109,6 +111,9 @@ class TestAudioop(unittest.TestCase): # Cursory d = audioop.lin2alaw(data[0], 1) self.assertEqual(audioop.alaw2lin(d, 1), data[0]) + self.assertEqual(audioop.alaw2lin(d, 2), b'\x08\x00\x08\x01\x10\x02') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb') @@ -119,6 +124,9 @@ class TestAudioop(unittest.TestCase): # Cursory d = audioop.lin2ulaw(data[0], 1) self.assertEqual(audioop.ulaw2lin(d, 1), data[0]) + self.assertEqual(audioop.ulaw2lin(d, 2), b'\x00\x00\x04\x01\x0c\x02') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') def test_mul(self): data2 = [] @@ -195,10 +203,15 @@ class TestAudioop(unittest.TestCase): self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2) self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state) self.assertRaises(audioop.error, audioop.lin2ulaw, data, size) - self.assertRaises(audioop.error, audioop.ulaw2lin, data, size) self.assertRaises(audioop.error, audioop.lin2alaw, data, size) - self.assertRaises(audioop.error, audioop.alaw2lin, data, size) self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state) + + def test_wrongsize(self): + data = b'abc' + state = None + for size in (-1, 3, 5): + self.assertRaises(audioop.error, audioop.ulaw2lin, data, size) + self.assertRaises(audioop.error, audioop.alaw2lin, data, size) self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state) def test_main(): @@ -111,6 +111,9 @@ Core and Builtins Library ------- +- Issue #13806: The size check in audioop decompression functions was too + strict and could reject valid compressed data. Patch by Oleg Plakhotnyuk. + - Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback. diff --git a/Modules/audioop.c b/Modules/audioop.c index a031d42..9ab4834 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -1313,7 +1313,7 @@ audioop_ulaw2lin(PyObject *self, PyObject *args) &cp, &len, &size) ) return 0; - if (!audioop_check_parameters(len, size)) + if (!audioop_check_size(size)) return NULL; if (len > PY_SSIZE_T_MAX/size) { @@ -1382,7 +1382,7 @@ audioop_alaw2lin(PyObject *self, PyObject *args) &cp, &len, &size) ) return 0; - if (!audioop_check_parameters(len, size)) + if (!audioop_check_size(size)) return NULL; if (len > PY_SSIZE_T_MAX/size) { @@ -1527,7 +1527,7 @@ audioop_adpcm2lin(PyObject *self, PyObject *args) &cp, &len, &size, &state) ) return 0; - if (!audioop_check_parameters(len, size)) + if (!audioop_check_size(size)) return NULL; /* Decode state, should have (value, step) */ |