[Scummvm-cvs-logs] scummvm master -> 89a330cb5d405596236576ca9516d0027c3f899a

wjp wjp at usecode.org
Fri Nov 30 23:25:05 CET 2012


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
f5dbd23bab DREAMWEB: Fix emergencyPurge checks
f2fe1b775a DREAMWEB: Make frame fixups more specific and add sanity checks
89a330cb5d DREAMWEB: Add some debugging output to emergencyPurge


Commit: f5dbd23baba645583ffcb9c452f4f88a5f83a412
    https://github.com/scummvm/scummvm/commit/f5dbd23baba645583ffcb9c452f4f88a5f83a412
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2012-11-30T11:06:36-08:00

Commit Message:
DREAMWEB: Fix emergencyPurge checks

It could re-delete previously deleted objects, causing
ex data (frame/text) corruption. This is the likely cause of bug #3591088.

Asm conversion error from eaf87bdfa7ac279f736c03b25af94ac1df3b31ce.

Changed paths:
    engines/dreamweb/object.cpp



diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index bb9e967..4586307 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -1131,7 +1131,8 @@ void DreamWebEngine::purgeAnItem() {
 	const DynObject *extraObjects = _exData;
 
 	for (uint i = 0; i < kNumexobjects; ++i) {
-		if (extraObjects[i].mapad[0] && extraObjects[i].objId[0] == 255 &&
+		if (extraObjects[i].mapad[0] == 0 &&
+		    (extraObjects[i].objId[0] == 255 || extraObjects[i].objId[0] == 2) &&
 			extraObjects[i].initialLocation != _realLocation) {
 			deleteExObject(i);
 			return;
@@ -1139,7 +1140,7 @@ void DreamWebEngine::purgeAnItem() {
 	}
 
 	for (uint i = 0; i < kNumexobjects; ++i) {
-		if (extraObjects[i].mapad[0] && extraObjects[i].objId[0] == 255) {
+		if (extraObjects[i].mapad[0] == 0 && extraObjects[i].objId[0] == 255) {
 			deleteExObject(i);
 			return;
 		}


Commit: f2fe1b775a4e344b51ada17415e125998a582efd
    https://github.com/scummvm/scummvm/commit/f2fe1b775a4e344b51ada17415e125998a582efd
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2012-11-30T11:06:41-08:00

Commit Message:
DREAMWEB: Make frame fixups more specific and add sanity checks

This should detect (and trigger asserts on) the kind of ex frame
data corruption in bug #3591088.

Changed paths:
    engines/dreamweb/object.cpp



diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index 4586307..ecd38f2 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -435,10 +435,23 @@ void DreamWebEngine::deleteExFrame(uint8 frameNum) {
 	_vars._exFramePos -= frameSize;
 
 	// Adjust all frame pointers pointing into the shifted data
-	for (unsigned int i = 0; i < 3*kNumexobjects; ++i) {
-		frame = &_exFrames._frames[i];
-		if (frame->ptr() >= startOff)
-			frame->setPtr(frame->ptr() - frameSize);
+	for (unsigned int i = 0; i < kNumexobjects; ++i) {
+		if (_exData[i].mapad[0] != 0xff) {
+			frame = &_exFrames._frames[3*i+0];
+			if (frame->ptr() >= startOff) {
+				frame->setPtr(frame->ptr() - frameSize);
+				assert(frame->ptr() + frame->width*frame->height <= _vars._exFramePos);
+			} else {
+				assert(frame->ptr() + frame->width*frame->height <= startOff);
+			}
+			frame = &_exFrames._frames[3*i+1];
+			if (frame->ptr() >= startOff) {
+				frame->setPtr(frame->ptr() - frameSize);
+				assert(frame->ptr() + frame->width*frame->height <= _vars._exFramePos);
+			} else {
+				assert(frame->ptr() + frame->width*frame->height <= startOff);
+			}
+		}
 	}
 }
 


Commit: 89a330cb5d405596236576ca9516d0027c3f899a
    https://github.com/scummvm/scummvm/commit/89a330cb5d405596236576ca9516d0027c3f899a
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2012-11-30T14:22:51-08:00

Commit Message:
DREAMWEB: Add some debugging output to emergencyPurge

Changed paths:
    engines/dreamweb/object.cpp



diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index ecd38f2..bee3a6d 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -1129,24 +1129,25 @@ void DreamWebEngine::incRyanPage() {
 }
 
 void DreamWebEngine::emergencyPurge() {
-	while (true) {
-		if (_vars._exFramePos + 4000 < kExframeslen) {
-			// Not near frame end
-			if (_vars._exTextPos + 400 < kExtextlen)
-				return;	// notneartextend
-		}
+	debug(2, "Ex memory: frames %d/%d, text %d/%d", _vars._exFramePos, kExframeslen, _vars._exTextPos, kExtextlen);
 
+	while (_vars._exFramePos + 4000 >= kExframeslen ||
+		   _vars._exTextPos + 400 >= kExtextlen)
+	{
 		purgeAnItem();
+		debug(2, "Ex memory after purging: frames %d/%d, text %d/%d", _vars._exFramePos, kExframeslen, _vars._exTextPos, kExtextlen);
 	}
 }
 
 void DreamWebEngine::purgeAnItem() {
 	const DynObject *extraObjects = _exData;
 
+
 	for (uint i = 0; i < kNumexobjects; ++i) {
 		if (extraObjects[i].mapad[0] == 0 &&
 		    (extraObjects[i].objId[0] == 255 || extraObjects[i].objId[0] == 2) &&
 			extraObjects[i].initialLocation != _realLocation) {
+			debug(1, "Purging ex object %d", i);
 			deleteExObject(i);
 			return;
 		}
@@ -1154,10 +1155,13 @@ void DreamWebEngine::purgeAnItem() {
 
 	for (uint i = 0; i < kNumexobjects; ++i) {
 		if (extraObjects[i].mapad[0] == 0 && extraObjects[i].objId[0] == 255) {
+			debug(1, "Purging ex object %d", i);
 			deleteExObject(i);
 			return;
 		}
 	}
+
+	error("Out of Ex object memory");
 }
 
 void DreamWebEngine::dropError() {






More information about the Scummvm-git-logs mailing list