[Scummvm-cvs-logs] SF.net SVN: scummvm:[35848] scummvm/trunk/engines/made

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Tue Jan 13 20:29:56 CET 2009


Revision: 35848
          http://scummvm.svn.sourceforge.net/scummvm/?rev=35848&view=rev
Author:   thebluegr
Date:     2009-01-13 19:29:55 +0000 (Tue, 13 Jan 2009)

Log Message:
-----------
Save game headers are now verified

Modified Paths:
--------------
    scummvm/trunk/engines/made/database.cpp
    scummvm/trunk/engines/made/database.h
    scummvm/trunk/engines/made/scriptfuncs.cpp

Modified: scummvm/trunk/engines/made/database.cpp
===================================================================
--- scummvm/trunk/engines/made/database.cpp	2009-01-13 18:11:11 UTC (rev 35847)
+++ scummvm/trunk/engines/made/database.cpp	2009-01-13 19:29:55 UTC (rev 35848)
@@ -416,7 +416,7 @@
 	// Not used in version 2 games
 }
 
-bool GameDatabaseV2::getSavegameDescription(const char *filename, Common::String &description) {
+bool GameDatabaseV2::getSavegameDescription(const char *filename, Common::String &description, int16 version) {
 	// Not used in version 2 games
 	return false;
 }
@@ -574,17 +574,38 @@
 	sourceS.read(_gameState, _gameStateSize);
 }
 
-bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description) {
+bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description, int16 version) {
 	Common::InSaveFile *in;
 	char desc[64];
+
 	if (!(in = g_system->getSavefileManager()->openForLoading(filename))) {
 		return false;
 	}
-	in->skip(4); // TODO: Verify marker 'SGAM'
-	in->skip(4); // TODO: Verify size
-	in->skip(2); // TODO: Verify version
+
+	uint32 header = in->readUint32BE();
+	if (header != MKID_BE('SGAM')) {
+		warning("Save game header missing");
+		delete in;
+		return false;
+	}
+
+	int32 size = in->readUint32LE();
+	if (size != in->size() - 64) {
+		warning("Unexpected save game size. Expected %d, size is %d (file size - 64)", size, in->size() - 64);
+		delete in;
+		return false;
+	}
+
+	int16 saveVersion = in->readUint16LE();
+	if (saveVersion != version) {
+		warning("Save game %s was saved with a different version of the game. Game version is %d, save version is %d", filename, version, saveVersion);
+		delete in;
+		return false;
+	}
+
 	in->read(desc, 64);
 	description = desc;
+
 	delete in;
 	return true;
 }
@@ -610,19 +631,38 @@
 
 int16 GameDatabaseV3::loadgame(const char *filename, int16 version) {
 	Common::InSaveFile *in;
-	int16 result = 0;
-	//uint32 expectedSize = 4 + 4 + 2 + _gameStateSize;
+	uint32 expectedSize = 4 + 4 + 2 + _gameStateSize;
+
 	if (!(in = g_system->getSavefileManager()->openForLoading(filename))) {
 		warning("Can't open file '%s', game not loaded", filename);
 		return 1;
 	}
-	in->skip(4); // TODO: Verify marker 'SGAM'
-	in->skip(4); // TODO: Verify size
-	in->skip(2); // TODO: Verify version
+
+	uint32 header = in->readUint32BE();
+	if (header != MKID_BE('SGAM')) {
+		warning("Save game header missing");
+		delete in;
+		return 1;
+	}
+
+	uint32 size = in->readUint32LE();
+	if (size != expectedSize) {
+		warning("Unexpected save game size. Expected %d, size is %d", expectedSize, size);
+		delete in;
+		return false;
+	}
+
+	int16 saveVersion = in->readUint16LE();
+	if (saveVersion != version) {
+		warning("Save game %s was saved with a different version of the game. Game version is %d, save version is %d", filename, version, saveVersion);
+		delete in;
+		return 1;
+	}
+
 	in->skip(64); // skip savegame description
 	in->read(_gameState, _gameStateSize);
 	delete in;
-	return result;
+	return 0;
 }
 
 int16 *GameDatabaseV3::findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag) {

Modified: scummvm/trunk/engines/made/database.h
===================================================================
--- scummvm/trunk/engines/made/database.h	2009-01-13 18:11:11 UTC (rev 35847)
+++ scummvm/trunk/engines/made/database.h	2009-01-13 19:29:55 UTC (rev 35848)
@@ -137,7 +137,7 @@
 
 	virtual int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag) = 0;
 	virtual const char *getString(uint16 offset) = 0;
-	virtual bool getSavegameDescription(const char *filename, Common::String &description) = 0;
+	virtual bool getSavegameDescription(const char *filename, Common::String &description, int16 version) = 0;
 	virtual int16 savegame(const char *filename, const char *description, int16 version) = 0;
 	virtual int16 loadgame(const char *filename, int16 version) = 0;
 
@@ -164,7 +164,7 @@
 	~GameDatabaseV2();
 	int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag);
 	const char *getString(uint16 offset);
-	bool getSavegameDescription(const char *filename, Common::String &description);
+	bool getSavegameDescription(const char *filename, Common::String &description, int16 version);
 	int16 savegame(const char *filename, const char *description, int16 version);
 	int16 loadgame(const char *filename, int16 version);
 protected:
@@ -178,7 +178,7 @@
 	GameDatabaseV3(MadeEngine *vm);
 	int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag);
 	const char *getString(uint16 offset);
-	bool getSavegameDescription(const char *filename, Common::String &description);
+	bool getSavegameDescription(const char *filename, Common::String &description, int16 version);
 	int16 savegame(const char *filename, const char *description, int16 version);
 	int16 loadgame(const char *filename, int16 version);
 protected:

Modified: scummvm/trunk/engines/made/scriptfuncs.cpp
===================================================================
--- scummvm/trunk/engines/made/scriptfuncs.cpp	2009-01-13 18:11:11 UTC (rev 35847)
+++ scummvm/trunk/engines/made/scriptfuncs.cpp	2009-01-13 19:29:55 UTC (rev 35848)
@@ -896,7 +896,7 @@
 
 	int16 descObjectIndex = argv[2];
 	int16 saveNum = argv[1];
-	/*int16 version = argv[0];*/
+	int16 version = argv[0];
 	Common::String description;
 
 	if (saveNum > 999)
@@ -904,7 +904,7 @@
 
 	Common::String filename = _vm->getSavegameFilename(saveNum);
 
-	if (_vm->_dat->getSavegameDescription(filename.c_str(), description)) {
+	if (_vm->_dat->getSavegameDescription(filename.c_str(), description, version)) {
 		_vm->_dat->setObjectString(descObjectIndex, description.c_str());
 		return 0;
 	} 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