aboutsummaryrefslogtreecommitdiff
path: root/engines/cryomni3d/dialogs_manager.cpp
diff options
context:
space:
mode:
authorLe Philousophe2019-03-06 20:57:19 +0100
committerEugene Sandulenko2019-06-01 22:43:48 +0200
commitc7205da58b7d7a82d86e0877f4933b0b5bfa74ca (patch)
tree42685b29bdc0421ce4f35bea2d17cfb60adb50fc /engines/cryomni3d/dialogs_manager.cpp
parent8d770af865c3ee01a230f68f3d5bf3f67c8da277 (diff)
downloadscummvm-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.cpp5
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) {