aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLittleboy2011-06-22 02:47:51 -0400
committerLittleboy2011-06-22 19:31:34 -0400
commit85bb5ef45e6b62b52317df2d83a7ad8663dbdfc0 (patch)
treeb6016e941313a2d152967d01c6ccd0612ca14c91
parent434a2e66b1fc59e1b7732591cfefd7e389905817 (diff)
downloadscummvm-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.cpp20
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;