[Scummvm-cvs-logs] SF.net SVN: scummvm:[50812] scummvm/trunk/engines/sci/engine/vm.cpp
m_kiewitz at users.sourceforge.net
m_kiewitz at users.sourceforge.net
Mon Jul 12 10:38:31 CEST 2010
Revision: 50812
http://scummvm.svn.sourceforge.net/scummvm/?rev=50812&view=rev
Author: m_kiewitz
Date: 2010-07-12 08:38:30 +0000 (Mon, 12 Jul 2010)
Log Message:
-----------
SCI: returning 0 when parameter reads go out-of-bounds, onto the stack and hit an uninitialized temp, fixes pq2 .490
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/vm.cpp
Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp 2010-07-12 06:00:19 UTC (rev 50811)
+++ scummvm/trunk/engines/sci/engine/vm.cpp 2010-07-12 08:38:30 UTC (rev 50812)
@@ -365,13 +365,25 @@
static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, int index, reg_t default_value) {
if (validate_variable(r, stack_base, type, max, index)) {
- if (type == VAR_TEMP && r[index].segment == 0xffff) {
- // Uninitialized read on a temp
- // We need to find correct replacements for each situation manually
- SciTrackOriginReply originReply;
- r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply);
- if ((r[index].segment == 0xFFFF) && (r[index].offset == 0xFFFF))
- error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset);
+ if (r[index].segment == 0xffff) {
+ switch (type) {
+ case VAR_TEMP: {
+ // Uninitialized read on a temp
+ // We need to find correct replacements for each situation manually
+ SciTrackOriginReply originReply;
+ r[index] = trackOriginAndFindWorkaround(index, uninitializedReadWorkarounds, &originReply);
+ if ((r[index].segment == 0xFFFF) && (r[index].offset == 0xFFFF))
+ error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), originReply.scriptNr, originReply.localCallOffset);
+ break;
+ }
+ case VAR_PARAM:
+ // Out-of-bounds read for a parameter that goes onto stack and hits an uninitialized temp
+ // We return 0 currently in that case
+ warning("Read for a parameter goes out-of-bounds, onto the stack and gets uninitialized temp");
+ return NULL_REG;
+ default:
+ break;
+ }
}
return r[index];
} else
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list