diff options
author | Christian Strømme <christian.stromme@digia.com> | 2013-03-20 19:45:40 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-22 17:50:22 +0100 |
commit | d64a68f5c8386e82fe9aa5e8eaf94f78124602f5 (patch) | |
tree | c463eacfd53f9a11935758f75964f1a5b659af6d | |
parent | 5ffe8bd6d93d78b4f258a34c15cde2f9155efb09 (diff) | |
download | qtmultimedia-d64a68f5c8386e82fe9aa5e8eaf94f78124602f5.tar.gz |
Fix calculation bug in QWaveDecoder.
When comparing the size of the WaveHeader and the chunk size, we need to
include the ID and Size fields, or any extra data won't be discarded and
the parsing will fail.
Change-Id: I730833f33f57b26cd750985354136191f7e7ce04
Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
-rw-r--r-- | src/multimedia/audio/qwavedecoder_p.cpp | 8 | ||||
-rw-r--r-- | tests/auto/unit/qwavedecoder/data/isawav_1_16_44100_le_2.wav | bin | 0 -> 22096 bytes | |||
-rw-r--r-- | tests/auto/unit/qwavedecoder/tst_qwavedecoder.cpp | 2 |
3 files changed, 7 insertions, 3 deletions
diff --git a/src/multimedia/audio/qwavedecoder_p.cpp b/src/multimedia/audio/qwavedecoder_p.cpp index 4b036b201..b75bfaf8f 100644 --- a/src/multimedia/audio/qwavedecoder_p.cpp +++ b/src/multimedia/audio/qwavedecoder_p.cpp @@ -153,13 +153,15 @@ void QWaveDecoder::handleData() chunk descriptor; peekChunk(&descriptor); - if (source->bytesAvailable() < qint64(descriptor.size + sizeof(chunk))) + quint32 rawChunkSize = descriptor.size + sizeof(chunk); + if (source->bytesAvailable() < qint64(rawChunkSize)) return; WAVEHeader wave; source->read(reinterpret_cast<char *>(&wave), sizeof(WAVEHeader)); - if (descriptor.size > sizeof(WAVEHeader)) - discardBytes(descriptor.size - sizeof(WAVEHeader)); + + if (rawChunkSize > sizeof(WAVEHeader)) + discardBytes(rawChunkSize - sizeof(WAVEHeader)); // Swizzle this if (bigEndian) { diff --git a/tests/auto/unit/qwavedecoder/data/isawav_1_16_44100_le_2.wav b/tests/auto/unit/qwavedecoder/data/isawav_1_16_44100_le_2.wav Binary files differnew file mode 100644 index 000000000..087e68e82 --- /dev/null +++ b/tests/auto/unit/qwavedecoder/data/isawav_1_16_44100_le_2.wav diff --git a/tests/auto/unit/qwavedecoder/tst_qwavedecoder.cpp b/tests/auto/unit/qwavedecoder/tst_qwavedecoder.cpp index c74fb51ae..494737223 100644 --- a/tests/auto/unit/qwavedecoder/tst_qwavedecoder.cpp +++ b/tests/auto/unit/qwavedecoder/tst_qwavedecoder.cpp @@ -130,6 +130,8 @@ void tst_QWaveDecoder::file_data() QTest::newRow("File isawav_1_16_44100_le.wav") << testFilePath("isawav_1_16_44100_le.wav") << tst_QWaveDecoder::None << 1 << 16 << 44100 << QAudioFormat::LittleEndian; QTest::newRow("File isawav_2_16_8000_be.wav") << testFilePath("isawav_2_16_8000_be.wav") << tst_QWaveDecoder::None << 2 << 16 << 8000 << QAudioFormat::BigEndian; QTest::newRow("File isawav_2_16_44100_be.wav") << testFilePath("isawav_2_16_44100_be.wav") << tst_QWaveDecoder::None << 2 << 16 << 44100 << QAudioFormat::BigEndian; + // The next file has extra data in the wave header. + QTest::newRow("File isawav_1_16_44100_le_2.wav") << testFilePath("isawav_1_16_44100_le_2.wav") << tst_QWaveDecoder::None << 1 << 16 << 44100 << QAudioFormat::LittleEndian; // 32 bit waves are not supported QTest::newRow("File isawav_1_32_8000_le.wav") << testFilePath("isawav_1_32_8000_le.wav") << tst_QWaveDecoder::FormatDescriptor << 1 << 32 << 8000 << QAudioFormat::LittleEndian; |