summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/multimedia/audio/qwavedecoder_p.cpp8
-rw-r--r--tests/auto/unit/qwavedecoder/data/isawav_1_16_44100_le_2.wavbin0 -> 22096 bytes
-rw-r--r--tests/auto/unit/qwavedecoder/tst_qwavedecoder.cpp2
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
new file mode 100644
index 000000000..087e68e82
--- /dev/null
+++ b/tests/auto/unit/qwavedecoder/data/isawav_1_16_44100_le_2.wav
Binary files differ
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;