[Scummvm-cvs-logs] SF.net SVN: scummvm:[33726] scummvm/trunk/engines/cine

buddha_ at users.sourceforge.net buddha_ at users.sourceforge.net
Sat Aug 9 22:55:04 CEST 2008


Revision: 33726
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33726&view=rev
Author:   buddha_
Date:     2008-08-09 20:55:01 +0000 (Sat, 09 Aug 2008)

Log Message:
-----------
Converted animDataTable from a plain array to a Common::Array. Should help to catch out of bounds access errors which may cause memory corruption.

Modified Paths:
--------------
    scummvm/trunk/engines/cine/anim.cpp
    scummvm/trunk/engines/cine/anim.h
    scummvm/trunk/engines/cine/cine.cpp
    scummvm/trunk/engines/cine/gfx.cpp

Modified: scummvm/trunk/engines/cine/anim.cpp
===================================================================
--- scummvm/trunk/engines/cine/anim.cpp	2008-08-09 20:50:10 UTC (rev 33725)
+++ scummvm/trunk/engines/cine/anim.cpp	2008-08-09 20:55:01 UTC (rev 33726)
@@ -49,7 +49,7 @@
 	uint16 field_E;
 };
 
-AnimData animDataTable[NUM_MAX_ANIMDATA];
+Common::Array<AnimData> animDataTable;
 
 static const AnimDataEntry transparencyData[] = {
 	{"ALPHA", 0xF},

Modified: scummvm/trunk/engines/cine/anim.h
===================================================================
--- scummvm/trunk/engines/cine/anim.h	2008-08-09 20:50:10 UTC (rev 33725)
+++ scummvm/trunk/engines/cine/anim.h	2008-08-09 20:55:01 UTC (rev 33726)
@@ -150,7 +150,7 @@
 
 #define NUM_MAX_ANIMDATA 255
 
-extern AnimData animDataTable[NUM_MAX_ANIMDATA];
+extern Common::Array<AnimData> animDataTable;
 
 void freeAnimDataTable(void);
 void freeAnimDataRange(byte startIdx, byte numIdx);

Modified: scummvm/trunk/engines/cine/cine.cpp
===================================================================
--- scummvm/trunk/engines/cine/cine.cpp	2008-08-09 20:50:10 UTC (rev 33725)
+++ scummvm/trunk/engines/cine/cine.cpp	2008-08-09 20:55:01 UTC (rev 33726)
@@ -128,6 +128,10 @@
 	objectTable.resize(NUM_MAX_OBJECT);
 	resetObjectTable();
 
+	// Resize animation data table to its correct size and reset all its elements
+	animDataTable.resize(NUM_MAX_ANIMDATA);
+	freeAnimDataTable();
+
 	_timerDelayMultiplier = 12; // Set default speed
 	setupOpcodes();
 

Modified: scummvm/trunk/engines/cine/gfx.cpp
===================================================================
--- scummvm/trunk/engines/cine/gfx.cpp	2008-08-09 20:50:10 UTC (rev 33725)
+++ scummvm/trunk/engines/cine/gfx.cpp	2008-08-09 20:55:01 UTC (rev 33726)
@@ -436,7 +436,7 @@
 	switch (it->type) {
 	// color sprite
 	case 0:
-		sprite = animDataTable + objectTable[it->objIdx].frame;
+		sprite = &animDataTable[objectTable[it->objIdx].frame];
 		len = sprite->_realWidth * sprite->_height;
 		mask = new byte[len];
 		memcpy(mask, sprite->mask(), len);
@@ -1074,7 +1074,7 @@
 		if (objectTable[it->objIdx].frame < 0) {
 			break;
 		}
-		sprite = animDataTable + objectTable[it->objIdx].frame;
+		sprite = &animDataTable[objectTable[it->objIdx].frame];
 		len = sprite->_realWidth * sprite->_height;
 		mask = new byte[len];
 		generateMask(sprite->data(), mask, len, objectTable[it->objIdx].part);
@@ -1108,7 +1108,7 @@
 		assert(it->objIdx < NUM_MAX_OBJECT);
 		var5 = it->x; // A global variable updated here!
 		obj = &objectTable[it->objIdx];
-		sprite = animDataTable + obj->frame;
+		sprite = &animDataTable[obj->frame];
 
 		if (obj->frame < 0 || it->x < 0 || it->x > 8 || !_bgTable[it->x].bg || sprite->_bpp != 1) {
 			break;


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