[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