aboutsummaryrefslogtreecommitdiff
path: root/engines/made/database.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2009-01-13 19:29:55 +0000
committerFilippos Karapetis2009-01-13 19:29:55 +0000
commit305954d34a612f14bdaad2cda9f982498f4f7066 (patch)
tree3d2e1bce1f59bc3541388fec200730f40733fef4 /engines/made/database.cpp
parent094fca2207cc88c5a82ab2ee7320e7345615a926 (diff)
downloadscummvm-rg350-305954d34a612f14bdaad2cda9f982498f4f7066.tar.gz
scummvm-rg350-305954d34a612f14bdaad2cda9f982498f4f7066.tar.bz2
scummvm-rg350-305954d34a612f14bdaad2cda9f982498f4f7066.zip
Save game headers are now verified
svn-id: r35848
Diffstat (limited to 'engines/made/database.cpp')
-rw-r--r--engines/made/database.cpp62
1 files changed, 51 insertions, 11 deletions
diff --git a/engines/made/database.cpp b/engines/made/database.cpp
index b317862951..ba7454be3e 100644
--- a/engines/made/database.cpp
+++ b/engines/made/database.cpp
@@ -416,7 +416,7 @@ void GameDatabaseV2::reloadFromStream(Common::SeekableReadStream &sourceS) {
// 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 @@ void GameDatabaseV3::reloadFromStream(Common::SeekableReadStream &sourceS) {
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::savegame(const char *filename, const char *description, in
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) {