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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Tue May 12 16:35:50 CEST 2009


Revision: 40489
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40489&view=rev
Author:   lordhoto
Date:     2009-05-12 14:35:50 +0000 (Tue, 12 May 2009)

Log Message:
-----------
Add proper error checking in file parsing code.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/script.cpp
    scummvm/trunk/engines/kyra/script_tim.cpp

Modified: scummvm/trunk/engines/kyra/script.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script.cpp	2009-05-12 14:18:08 UTC (rev 40488)
+++ scummvm/trunk/engines/kyra/script.cpp	2009-05-12 14:35:50 UTC (rev 40489)
@@ -83,13 +83,15 @@
 		case MKID_BE('TEXT'):
 			scriptData->text = new byte[chunk->size];
 			assert(scriptData->text);
-			chunk->read(scriptData->text, chunk->size);
+			if (chunk->read(scriptData->text, chunk->size) != chunk->size)
+				error("Couldn't read TEXT chunk from file '%s'", filename);
 			break;
 
 		case MKID_BE('ORDR'):
 			scriptData->ordr = new uint16[chunk->size >> 1];
 			assert(scriptData->ordr);
-			chunk->read(scriptData->ordr, chunk->size);
+			if (chunk->read(scriptData->ordr, chunk->size) != chunk->size)
+				error("Couldn't read ORDR chunk from file '%s'", filename);
 
 			for (int i = (chunk->size >> 1) - 1; i >= 0; --i)
 				scriptData->ordr[i] = READ_BE_UINT16(&scriptData->ordr[i]);
@@ -98,7 +100,8 @@
 		case MKID_BE('DATA'):
 			scriptData->data = new uint16[chunk->size >> 1];
 			assert(scriptData->data);
-			chunk->read(scriptData->data, chunk->size);
+			if (chunk->read(scriptData->data, chunk->size) != chunk->size)
+				error("Couldn't read DATA chunk from file '%s'", filename);
 
 			for (int i = (chunk->size >> 1) - 1; i >= 0; --i)
 				scriptData->data[i] = READ_BE_UINT16(&scriptData->data[i]);
@@ -110,18 +113,15 @@
 		}
 	}
 
-	if (!scriptData->ordr) {
-		unload(scriptData);
-		error("Couldn't read ORDR chunk from file: '%s'", filename);
-		return false;
-	}
+	if (!scriptData->ordr)
+		error("No ORDR chunk found in file: '%s'", filename);
 
-	if (!scriptData->data) {
-		unload(scriptData);
-		error("Couldn't read DATA chunk from file: '%s'", filename);
-		return false;
-	}
+	if (!scriptData->data)
+		error("No DATA chunk found in file: '%s'", filename);
 
+	if (stream->err())
+		error("Read error while parsing file '%s", filename);
+
 	delete stream;
 
 	scriptData->sysFuncs = opcodes;

Modified: scummvm/trunk/engines/kyra/script_tim.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_tim.cpp	2009-05-12 14:18:08 UTC (rev 40488)
+++ scummvm/trunk/engines/kyra/script_tim.cpp	2009-05-12 14:35:50 UTC (rev 40489)
@@ -149,7 +149,8 @@
 			avtlChunkSize = chunk->size >> 1;
 			tim->avtl = new uint16[avtlChunkSize];
 			assert(tim->avtl);
-			chunk->read(tim->avtl, chunk->size);
+			if (chunk->read(tim->avtl, chunk->size) != chunk->size)
+				error("Couldn't read AVTL chunk from file '%s'", filename);
 
 			for (int i = avtlChunkSize - 1; i >= 0; --i)
 				tim->avtl[i] = READ_LE_UINT16(&tim->avtl[i]);
@@ -161,11 +162,14 @@
 		}
 	}
 
+	if (!tim->avtl)
+		error("No AVTL chunk found in file: '%s'", filename);
+
+	if (stream->err())
+		error("Read error while parsing file '%s", filename);
+
 	delete stream;
 
-	if (!tim->avtl)
-		error("Couldn't read AVTL chunk from file: '%s'", filename);
-
 	int num = (avtlChunkSize < TIM::kCountFuncs) ? avtlChunkSize : (int)TIM::kCountFuncs;
 	for (int i = 0; i < num; ++i)
 		tim->func[i].avtl = tim->avtl + tim->avtl[i];


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