[Scummvm-cvs-logs] scummvm master -> 02fe2ded354ecbfd87acdc4493be4b41a759d1d9

wjp wjp at usecode.org
Sat Dec 1 12:41:53 CET 2012


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

Summary:
02fe2ded35 DREAMWEB: Check for exFrame data corruption on load


Commit: 02fe2ded354ecbfd87acdc4493be4b41a759d1d9
    https://github.com/scummvm/scummvm/commit/02fe2ded354ecbfd87acdc4493be4b41a759d1d9
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2012-12-01T03:40:24-08:00

Commit Message:
DREAMWEB: Check for exFrame data corruption on load

This provides earlier detection for corrupted savegames caused by
bug #3591088

Changed paths:
    engines/dreamweb/saveload.cpp



diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
index 162ad53..8a0791d 100644
--- a/engines/dreamweb/saveload.cpp
+++ b/engines/dreamweb/saveload.cpp
@@ -574,6 +574,14 @@ void DreamWebEngine::savePosition(unsigned int slot, const char *descbuf) {
 	delete outSaveFile;
 }
 
+
+// Utility struct for a savegame sanity check in loadPosition
+struct FrameExtent {
+	uint16 start;
+	uint16 length;
+	bool operator<(const struct FrameExtent& other) const { return start<other.start; }
+};
+
 void DreamWebEngine::loadPosition(unsigned int slot) {
 	_timeCount = 0;
 	clearChanges();
@@ -653,6 +661,42 @@ void DreamWebEngine::loadPosition(unsigned int slot) {
 	}
 
 	delete inSaveFile;
+
+
+	// Do a sanity check on exFrames data to detect exFrames corruption
+	// caused by a (now fixed) bug in emergencyPurge. See bug #3591088.
+	// Gather the location of frame data of all used ex object frames.
+	Common::List<FrameExtent> flist;
+	for (unsigned int i = 0; i < kNumexobjects; ++i) {
+		if (_exData[i].mapad[0] != 0xff) {
+			FrameExtent fe;
+			Frame *frame = &_exFrames._frames[3*i+0];
+			fe.start = frame->ptr();
+			fe.length = frame->width * frame->height;
+			flist.push_back(fe);
+
+			frame = &_exFrames._frames[3*i+1];
+			fe.start = frame->ptr();
+			fe.length = frame->width * frame->height;
+			flist.push_back(fe);
+		}
+	}
+	// ...and check if the frames overlap.
+	Common::sort(flist.begin(), flist.end(), Common::Less<FrameExtent>());
+	Common::List<FrameExtent>::const_iterator iter;
+	uint16 curEnd = 0;
+	for (iter = flist.begin(); iter != flist.end(); ++iter) {
+		if (iter->start < curEnd)
+			error("exFrames data corruption in savegame");
+		curEnd = iter->start + iter->length;
+	}
+	if (curEnd > _vars._exFramePos) {
+		if (curEnd > kExframeslen)
+			error("exFrames data corruption in savegame");
+		warning("Fixing up exFramePos");
+		_vars._exFramePos = curEnd;
+	}
+	// (end of sanity check)
 }
 
 // Count number of save files, and load their descriptions into _saveNames






More information about the Scummvm-git-logs mailing list