diff options
-rw-r--r-- | engines/bladerunner/savefile.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/engines/bladerunner/savefile.cpp b/engines/bladerunner/savefile.cpp index bc5227dbb4..b1e5aa3136 100644 --- a/engines/bladerunner/savefile.cpp +++ b/engines/bladerunner/savefile.cpp @@ -99,7 +99,6 @@ void SaveFileManager::remove(const Common::String &target, int slot) { bool SaveFileManager::readHeader(Common::SeekableReadStream &in, SaveFileHeader &header, bool skipThumbnail) { SaveFileReadStream s(in); - if (s.readUint32BE() != kTag) { warning("No header found in save file"); return false; @@ -121,11 +120,24 @@ bool SaveFileManager::readHeader(Common::SeekableReadStream &in, SaveFileHeader header._thumbnail = nullptr; + // Early check of possible corrupted save file (missing thumbnail and other data) + int32 pos = s.pos(); + int32 sizeOfSaveFile = s.size(); + if (sizeOfSaveFile > 0 && sizeOfSaveFile < (int32) (pos + 4 + kThumbnailSize)) { + warning("Unexpected end of save file %s (%02d:%02d %02d/%02d/%04d) reached. Size of file was: %d bytes", + header._name.c_str(), + header._hour, + header._minute, + header._day, + header._month, + header._year, + sizeOfSaveFile); + return false; + } + if (!skipThumbnail) { header._thumbnail = new Graphics::Surface(); // freed by ScummVM's smartptr - int32 pos = s.pos(); - s.skip(4); //skip size; void *thumbnailData = malloc(kThumbnailSize); // freed by ScummVM's smartptr |