aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorFilippos Karapetis2010-07-22 17:25:21 +0000
committerFilippos Karapetis2010-07-22 17:25:21 +0000
commit634d959897695bda9371411ebb9ffda9a09f18d9 (patch)
treedd9a3349610053ae9d19fbdd6c52c16b5bf2093b /engines/sci/engine
parent756ab24f3203837f1101b995c90d1ebbdb4e54b2 (diff)
downloadscummvm-rg350-634d959897695bda9371411ebb9ffda9a09f18d9.tar.gz
scummvm-rg350-634d959897695bda9371411ebb9ffda9a09f18d9.tar.bz2
scummvm-rg350-634d959897695bda9371411ebb9ffda9a09f18d9.zip
SCI: Fixed the crash in LSL2, room 42 (when arriving at the island). kAnimate may refer to unfrozen objects which have been deleted, thus handle that case accordingly.
svn-id: r51152
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/seg_manager.cpp5
-rw-r--r--engines/sci/engine/seg_manager.h2
2 files changed, 5 insertions, 2 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index ef2279e492..25cf1d069f 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -508,7 +508,7 @@ List *SegManager::lookupList(reg_t addr) {
return &(lt->_table[addr.offset]);
}
-Node *SegManager::lookupNode(reg_t addr) {
+Node *SegManager::lookupNode(reg_t addr, bool stopOnDiscarded) {
if (addr.isNull())
return NULL; // Non-error null
@@ -522,6 +522,9 @@ Node *SegManager::lookupNode(reg_t addr) {
NodeTable *nt = (NodeTable *)_heap[addr.segment];
if (!nt->isValidEntry(addr.offset)) {
+ if (!stopOnDiscarded)
+ return NULL;
+
error("Attempt to use invalid or discarded reference %04x:%04x as list node", PRINT_REG(addr));
return NULL;
}
diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h
index a7f5f8517f..e0808dbb1b 100644
--- a/engines/sci/engine/seg_manager.h
+++ b/engines/sci/engine/seg_manager.h
@@ -232,7 +232,7 @@ public:
* @param addr The address to resolve
* @return The list node referenced, or NULL on error
*/
- Node *lookupNode(reg_t addr);
+ Node *lookupNode(reg_t addr, bool stopOnDiscarded = true);
// 8. Hunk Memory