aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authormd52011-05-27 03:06:06 +0300
committermd52011-05-27 03:06:06 +0300
commit48140a012d69d76de5ae80de7ca926e71c39cd03 (patch)
tree199eec7aea4753d535d6f43a60f990d66ff9b357 /engines/sci/engine
parent28b7cf71a98981b6d77598aca026572ba32ee1b4 (diff)
downloadscummvm-rg350-48140a012d69d76de5ae80de7ca926e71c39cd03.tar.gz
scummvm-rg350-48140a012d69d76de5ae80de7ca926e71c39cd03.tar.bz2
scummvm-rg350-48140a012d69d76de5ae80de7ca926e71c39cd03.zip
SCI: Don't attempt to modify null/disposed objects.
These cases occur usually because of script bugs. Fixes script bug #3303802 - "SCI: PQ1VGA - Crash at the jail"
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/vm.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 499574957e..af34e6d924 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -297,6 +297,13 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj, StackPt
if (argc > 0x800) // More arguments than the stack could possibly accomodate for
error("send_selector(): More than 0x800 arguments to function call");
+ if (send_obj.isNull()) {
+ warning("Attempt to invoke a selector of a null/disposed object. Ignoring call");
+ framesize -= (2 + argc);
+ argp += argc + 1;
+ continue;
+ }
+
SelectorType selectorType = lookupSelector(s->_segMan, send_obj, selector, &varp, &funcp);
if (selectorType == kSelectorNone)
error("Send to invalid selector 0x%x of object at %04x:%04x", 0xffff & selector, PRINT_REG(send_obj));