diff options
author | Le Philousophe | 2019-03-06 20:57:19 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2019-06-01 22:43:48 +0200 |
commit | c7205da58b7d7a82d86e0877f4933b0b5bfa74ca (patch) | |
tree | 42685b29bdc0421ce4f35bea2d17cfb60adb50fc /engines/cryomni3d/dialogs_manager.cpp | |
parent | 8d770af865c3ee01a230f68f3d5bf3f67c8da277 (diff) | |
download | scummvm-rg350-c7205da58b7d7a82d86e0877f4933b0b5bfa74ca.tar.gz scummvm-rg350-c7205da58b7d7a82d86e0877f4933b0b5bfa74ca.tar.bz2 scummvm-rg350-c7205da58b7d7a82d86e0877f4933b0b5bfa74ca.zip |
CRYOMNI3D: Fix use after free when playing dialog
Diffstat (limited to 'engines/cryomni3d/dialogs_manager.cpp')
-rw-r--r-- | engines/cryomni3d/dialogs_manager.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/engines/cryomni3d/dialogs_manager.cpp b/engines/cryomni3d/dialogs_manager.cpp index 6c1c2ac5ad..badd742120 100644 --- a/engines/cryomni3d/dialogs_manager.cpp +++ b/engines/cryomni3d/dialogs_manager.cpp @@ -257,6 +257,9 @@ bool DialogsManager::play(const Common::String &sequence, bool &slowStop) { bool playerLabel = !strncmp(label, "JOU", 3); bool didSomething = false; bool finished = false; + /* Keep the gotoList outside the loop to avoid it being freed at the end of it and + * having label possibly pointing on free memory */ + Common::Array<DialogsManager::Goto> gotoList; while (!finished) { const char *actions; if (playerLabel) { @@ -284,7 +287,7 @@ bool DialogsManager::play(const Common::String &sequence, bool &slowStop) { didSomething = true; actions = nextLine(text); } - Common::Array<DialogsManager::Goto> gotoList = executeAfterPlayAndBuildGotoList(actions); + gotoList = executeAfterPlayAndBuildGotoList(actions); Common::StringArray questions; bool endOfConversationFound = false;; if (_ignoreNoEndOfConversation) { |