[Scummvm-cvs-logs] SF.net SVN: scummvm:[39421] scummvm/trunk/engines/kyra/resource_intern.cpp

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sun Mar 15 15:55:49 CET 2009


Revision: 39421
          http://scummvm.svn.sourceforge.net/scummvm/?rev=39421&view=rev
Author:   lordhoto
Date:     2009-03-15 14:55:48 +0000 (Sun, 15 Mar 2009)

Log Message:
-----------
Cleanup.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/resource_intern.cpp

Modified: scummvm/trunk/engines/kyra/resource_intern.cpp
===================================================================
--- scummvm/trunk/engines/kyra/resource_intern.cpp	2009-03-15 14:48:08 UTC (rev 39420)
+++ scummvm/trunk/engines/kyra/resource_intern.cpp	2009-03-15 14:55:48 UTC (rev 39421)
@@ -143,13 +143,16 @@
 }
 
 bool ResLoaderPak::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
-	uint32 filesize = stream.size();
-	uint32 offset = 0;
+	int32 filesize = stream.size();
+	if (filesize < 0)
+		return false;
+
+	int32 offset = 0;
 	bool switchEndian = false;
 	bool firstFile = true;
 
 	offset = stream.readUint32LE();
-	if (offset > filesize) {
+	if (offset > filesize || offset < 0) {
 		switchEndian = true;
 		offset = SWAP_BYTES_32(offset);
 	}
@@ -157,7 +160,7 @@
 	Common::String file;
 	while (!stream.eos()) {
 		// The start offset of a file should never be in the filelist
-		if (offset < (uint32)stream.pos() || offset > filesize)
+		if (offset < stream.pos() || offset > filesize || offset < 0)
 			return false;
 
 		byte c = 0;
@@ -212,14 +215,16 @@
 } // end of anonymous namespace
 
 Common::Archive *ResLoaderPak::load(Common::SharedPtr<Common::ArchiveMember> memberFile, Common::SeekableReadStream &stream) const {
-	uint32 filesize = stream.size();
+	int32 filesize = stream.size();
+	if (filesize < 0)
+		return 0;
 
-	uint32 startoffset = 0, endoffset = 0;
+	int32 startoffset = 0, endoffset = 0;
 	bool switchEndian = false;
 	bool firstFile = true;
 
 	startoffset = stream.readUint32LE();
-	if (startoffset > filesize) {
+	if (startoffset > filesize || startoffset < 0) {
 		switchEndian = true;
 		startoffset = SWAP_BYTES_32(startoffset);
 	}
@@ -229,9 +234,9 @@
 	Common::String file;
 	while (!stream.eos()) {
 		// The start offset of a file should never be in the filelist
-		if (startoffset < (uint32)stream.pos() || startoffset > filesize) {
+		if (startoffset < stream.pos() || startoffset > filesize || startoffset < 0) {
 			warning("PAK file '%s' is corrupted", memberFile->getDisplayName().c_str());
-			return false;
+			return 0;
 		}
 
 		file.clear();
@@ -242,14 +247,14 @@
 
 		if (stream.eos()) {
 			warning("PAK file '%s' is corrupted", memberFile->getDisplayName().c_str());
-			return false;
+			return 0;
 		}
 
 		// Quit now if we encounter an empty string
 		if (file.empty()) {
 			if (firstFile) {
 				warning("PAK file '%s' is corrupted", memberFile->getDisplayName().c_str());
-				return false;
+				return 0;
 			} else {
 				break;
 			}
@@ -258,6 +263,11 @@
 		firstFile = false;
 		endoffset = switchEndian ? stream.readUint32BE() : stream.readUint32LE();
 
+		if (endoffset < 0) {
+			warning("PAK file '%s' is corrupted", memberFile->getDisplayName().c_str());
+			return 0;
+		}
+
 		if (!endoffset)
 			endoffset = filesize;
 


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