aboutsummaryrefslogtreecommitdiff
path: root/audio/midiparser.cpp
diff options
context:
space:
mode:
authorathrxx2014-01-26 22:42:13 +0100
committerathrxx2014-01-26 22:51:39 +0100
commitafa54072a9622d7a370846bf280016843dc61009 (patch)
treee5900325603e260053d01343a374abe339683e1f /audio/midiparser.cpp
parentfa78f38ca7fa9305aca4c8bcb274fc4067423273 (diff)
downloadscummvm-rg350-afa54072a9622d7a370846bf280016843dc61009.tar.gz
scummvm-rg350-afa54072a9622d7a370846bf280016843dc61009.tar.bz2
scummvm-rg350-afa54072a9622d7a370846bf280016843dc61009.zip
AUDIO: fix invalid mem access in midiparser.cpp
(this caused a crash in MI2)
Diffstat (limited to 'audio/midiparser.cpp')
-rw-r--r--audio/midiparser.cpp31
1 files changed, 16 insertions, 15 deletions
diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp
index 2454575413..6840cfcbad 100644
--- a/audio/midiparser.cpp
+++ b/audio/midiparser.cpp
@@ -214,6 +214,21 @@ void MidiParser::onTimer() {
activeNote(info.channel(), info.basic.param1, true);
}
+ if (info.event == 0xFF && info.ext.type == 0x2F) {
+ // End of Track must be processed by us, as well as sending it to the output device.
+ // It must be processed here instead of inside processEvent() to avoid invalid mem access,
+ // since Player::metaEvent() in SCUMM will delete the parser object.
+ if (_autoLoop) {
+ jumpToTick(0);
+ parseNextEvent(_nextEvent);
+ } else {
+ stopPlaying();
+ _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
+ }
+ return;
+
+ }
+
processEvent(info);
if (_abortParse)
@@ -240,21 +255,7 @@ void MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
_driver->sysEx(info.ext.data, (uint16)info.length);
}
} else if (info.event == 0xFF) {
- // META event
- if (info.ext.type == 0x2F) {
- // End of Track must be processed by us,
- // as well as sending it to the output device.
- if (_autoLoop) {
- jumpToTick(0);
- parseNextEvent(_nextEvent);
- } else {
- stopPlaying();
- if (fireEvents)
- _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
- }
- _abortParse = true;
- return;
- } else if (info.ext.type == 0x51) {
+ if (info.ext.type == 0x51) {
if (info.length >= 3) {
setTempo(info.ext.data[0] << 16 | info.ext.data[1] << 8 | info.ext.data[2]);
}