aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2013-06-04 06:11:41 +0200
committerTorbjörn Andersson2013-06-04 06:11:41 +0200
commit08be91604900f0d43380b3429a2aef87378c710f (patch)
tree120af1528730843f22d40039330040092bf6af7a
parent1cc0e9cb8813a39c9f9d95287b811dbb534e3868 (diff)
downloadscummvm-rg350-08be91604900f0d43380b3429a2aef87378c710f.tar.gz
scummvm-rg350-08be91604900f0d43380b3429a2aef87378c710f.tar.bz2
scummvm-rg350-08be91604900f0d43380b3429a2aef87378c710f.zip
SCUMM: Verify sample width in Digital iMUSE callback. CID 1002112
Verify that 'bits' really is one of 8, 12 or 16 before decoding the data. It's probably always the case (unless the data files are damaged) but if it isn't we'll either try to queue NULL to the audio stream, or queue the same buffer more than once, or free the buffer more than once. All of which are bad, though Coverity only noticed the last of these cases.
-rw-r--r--engines/scumm/imuse_digi/dimuse.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp
index eb3717494f..a737539c44 100644
--- a/engines/scumm/imuse_digi/dimuse.cpp
+++ b/engines/scumm/imuse_digi/dimuse.cpp
@@ -275,9 +275,12 @@ void IMuseDigital::callback() {
feedSize &= ~1;
if (channels == 2)
feedSize &= ~3;
- } else {
+ } else if (bits == 8) {
if (channels == 2)
feedSize &= ~1;
+ } else {
+ warning("IMuseDigita::callback: Unexpected sample width, %d bits", bits);
+ continue;
}
if (feedSize == 0)