aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/seg_manager.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index 3157c84f85..12625691fd 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -272,9 +272,23 @@ const char *SegManager::getObjectName(reg_t pos) {
if (nameReg.isNull())
return "<no name>";
- const char *name = 0;
- if (nameReg.getSegment())
- name = derefString(nameReg);
+ const char *name = nullptr;
+
+ if (nameReg.getSegment()) {
+#ifdef ENABLE_SCI32
+ // At least Torin script 64000 creates objects with names that are
+ // pointed to dynamically generated strings which are freed before the
+ // objects themselves are freed. This causes a crash when using
+ // `findObjectByName`, since the name of the object is no longer valid
+ if (nameReg.getSegment() != _arraysSegId ||
+ _heap[_arraysSegId]->isValidOffset(nameReg.getOffset())) {
+#endif
+ name = derefString(nameReg);
+#ifdef ENABLE_SCI32
+ }
+#endif
+ }
+
if (!name) {
// Crazy Nick Laura Bow is missing some object names needed for the static
// selector vocabulary