SCUMM: (DOTT) - fix bug no. 12776 ("Use after free error in DOTT intro")

This commit is contained in:
athrxx
2021-08-10 19:44:14 +02:00
parent b72d6d89b9
commit 0876537f06
2 changed files with 28 additions and 7 deletions
+8
View File
@@ -178,8 +178,16 @@ protected:
static uint16 _active_notes[128];
protected:
enum ParserType {
kParserTypeNone = 0,
kParserTypeRO,
kParserTypeXMI,
kParserTypeSMF
};
MidiDriver *_midi;
MidiParser *_parser;
ParserType _parserType;
Part *_parts;
bool _active;
+20 -7
View File
@@ -82,7 +82,8 @@ Player::Player() :
_se(0),
_vol_chan(0),
_abort(false),
_music_tick(0) {
_music_tick(0),
_parserType(kParserTypeNone) {
}
Player::~Player() {
@@ -151,9 +152,9 @@ void Player::clear() {
if (_parser) {
_parser->unloadMusic();
delete _parser;
_parser = 0;
_parser->setMidiDriver(NULL);
}
uninit_parts();
_se->ImFireAllTriggers(_id);
_active = false;
@@ -181,17 +182,28 @@ int Player::start_seq_sound(int sound, bool reset_vars) {
ptr = _se->findStartOfSound(sound);
if (ptr == NULL)
return -1;
delete _parser;
if (!memcmp(ptr, "RO", 2)) {
// Old style 'RO' resource
_parser = MidiParser_createRO();
if (_parserType != kParserTypeRO) {
delete _parser;
_parser = MidiParser_createRO();
_parserType = kParserTypeRO;
}
} else if (!memcmp(ptr, "FORM", 4)) {
// Humongous Games XMIDI resource
_parser = MidiParser::createParser_XMIDI();
if (_parserType != kParserTypeXMI) {
delete _parser;
_parser = MidiParser::createParser_XMIDI();
_parserType = kParserTypeXMI;
}
} else {
// SCUMM SMF resource
_parser = MidiParser::createParser_SMF();
if (_parserType != kParserTypeSMF) {
delete _parser;
_parser = MidiParser::createParser_SMF();
_parserType = kParserTypeSMF;
}
}
_parser->setMidiDriver(this);
@@ -1010,6 +1022,7 @@ void Player::fixAfterLoad() {
if (!_midi) {
clear();
} else {
_parserType = kParserTypeNone;
start_seq_sound(_id, false);
setSpeed(_speed);
if (_parser)