From: Michiel W. Beijen Date: Wed, 15 Apr 2026 12:21:43 +0000 (+0200) Subject: gh-117716: Fix wave RIFF padding for data chunks (GH-145237) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ca064d9b9999657332d8c73b7b4079ce4311ccec;p=thirdparty%2FPython%2Fcpython.git gh-117716: Fix wave RIFF padding for data chunks (GH-145237) wave.Wave_write now writes the required RIFF pad byte when the data chunk size is odd. Update RIFF chunk size calculations in both header writing and header patching so they include the alignment pad byte when present. Add a regression test in test_wave.py that verifies odd-sized writes are padded, RIFF size is correct, and roundtrip reads preserve frame data. --- diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index 86886ac768f6..d3723c04820d 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -430,6 +430,30 @@ class WaveLowLevelTest(unittest.TestCase): f.setframerate(arg) self.assertEqual(f.getframerate(), expected) + def test_write_odd_data_chunk_pads_and_updates_riff_size(self): + # gh-117716: odd-sized data chunks must be padded with one zero byte. + with io.BytesIO() as output: + with wave.open(output, mode='wb') as w: + w.setnchannels(1) + w.setsampwidth(1) + w.setframerate(48000) + w.writeframes(b'\x80') + + value = output.getvalue() + + self.assertEqual(value[-1], 0) + self.assertEqual( + int.from_bytes(value[4:8], byteorder='little'), + 38, + ) + + with wave.open(io.BytesIO(value), mode='rb') as r: + self.assertEqual(r.getnchannels(), 1) + self.assertEqual(r.getsampwidth(), 1) + self.assertEqual(r.getframerate(), 48000) + self.assertEqual(r.getnframes(), 1) + self.assertEqual(r.readframes(-1), b'\x80') + class WaveOpen(unittest.TestCase): def test_open_pathlike(self): diff --git a/Lib/wave.py b/Lib/wave.py index 6e84c107b9fb..c4e1a493a7ec 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -611,6 +611,8 @@ class Wave_write: try: if self._file: self._ensure_header_written(0) + if self._datawritten & 1: + self._file.write(b'\x00') if self._datalength != self._datawritten: self._patchheader() self._file.flush() @@ -651,7 +653,7 @@ class Wave_write: has_fact = self._needs_fact_chunk() header_overhead = 36 + (12 if has_fact else 0) self._file.write(struct.pack('