diff options
author | Littleboy | 2011-06-22 02:47:51 -0400 |
---|---|---|
committer | Littleboy | 2011-06-22 19:31:34 -0400 |
commit | 85bb5ef45e6b62b52317df2d83a7ad8663dbdfc0 (patch) | |
tree | b6016e941313a2d152967d01c6ccd0612ca14c91 | |
parent | 434a2e66b1fc59e1b7732591cfefd7e389905817 (diff) | |
download | scummvm-rg350-85bb5ef45e6b62b52317df2d83a7ad8663dbdfc0.tar.gz scummvm-rg350-85bb5ef45e6b62b52317df2d83a7ad8663dbdfc0.tar.bz2 scummvm-rg350-85bb5ef45e6b62b52317df2d83a7ad8663dbdfc0.zip |
LASTEXPRESS: Fix leak and corruption of event handlers function pointers
- Add better error handling
- Properly delete previous event handlers when setting new ones or restoring from backup
-rw-r--r-- | engines/lastexpress/lastexpress.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp index e162998719..120e6eb28b 100644 --- a/engines/lastexpress/lastexpress.cpp +++ b/engines/lastexpress/lastexpress.cpp @@ -288,22 +288,34 @@ void LastExpressEngine::handleSoundTimer() { /// Event Handling /////////////////////////////////////////////////////////////////////////////////// void LastExpressEngine::backupEventHandlers() { + if (_eventMouseBackup != NULL || _eventTickBackup != NULL) + error("[LastExpressEngine::backupEventHandlers] backup event handlers are already set"); + _eventMouseBackup = _eventMouse; _eventTickBackup = _eventTick; } void LastExpressEngine::restoreEventHandlers() { if (_eventMouseBackup == NULL || _eventTickBackup == NULL) - error("LastExpressEngine::restoreEventHandlers: restore called before backing up the event handlers!"); + error("[LastExpressEngine::restoreEventHandlers] restore called before backing up the event handlers"); + + // Cleanup previous event handlers + SAFE_DELETE(_eventMouse); + SAFE_DELETE(_eventTick); _eventMouse = _eventMouseBackup; _eventTick = _eventTickBackup; + + _eventMouseBackup = NULL; + _eventTickBackup = NULL; } void LastExpressEngine::setEventHandlers(EventHandler::EventFunction *mouse, EventHandler::EventFunction *tick) { - // Cleanup previous event handlers - delete _eventMouse; - delete _eventTick; + if (_eventMouse != _eventMouseBackup) + SAFE_DELETE(_eventMouse); + + if (_eventTick != _eventTickBackup) + SAFE_DELETE(_eventTick); _eventMouse = mouse; _eventTick = tick; |