Skip to content

Commit 983a4f2

Browse files
author
Kari Salminen
committed
Converted animDataTable from a plain array to a Common::Array. Should help to catch out of bounds access errors which may cause memory corruption.
svn-id: r33726
1 parent 0911982 commit 983a4f2

File tree

4 files changed

+9
-5
lines changed

4 files changed

+9
-5
lines changed

engines/cine/anim.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct AnimHeader2Struct {
4949
uint16 field_E;
5050
};
5151

52-
AnimData animDataTable[NUM_MAX_ANIMDATA];
52+
Common::Array<AnimData> animDataTable;
5353

5454
static const AnimDataEntry transparencyData[] = {
5555
{"ALPHA", 0xF},

engines/cine/anim.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class AnimData {
150150

151151
#define NUM_MAX_ANIMDATA 255
152152

153-
extern AnimData animDataTable[NUM_MAX_ANIMDATA];
153+
extern Common::Array<AnimData> animDataTable;
154154

155155
void freeAnimDataTable(void);
156156
void freeAnimDataRange(byte startIdx, byte numIdx);

engines/cine/cine.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ void CineEngine::initialize() {
128128
objectTable.resize(NUM_MAX_OBJECT);
129129
resetObjectTable();
130130

131+
// Resize animation data table to its correct size and reset all its elements
132+
animDataTable.resize(NUM_MAX_ANIMDATA);
133+
freeAnimDataTable();
134+
131135
_timerDelayMultiplier = 12; // Set default speed
132136
setupOpcodes();
133137

engines/cine/gfx.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ void FWRenderer::renderOverlay(const Common::List<overlay>::iterator &it) {
436436
switch (it->type) {
437437
// color sprite
438438
case 0:
439-
sprite = animDataTable + objectTable[it->objIdx].frame;
439+
sprite = &animDataTable[objectTable[it->objIdx].frame];
440440
len = sprite->_realWidth * sprite->_height;
441441
mask = new byte[len];
442442
memcpy(mask, sprite->mask(), len);
@@ -1074,7 +1074,7 @@ void OSRenderer::renderOverlay(const Common::List<overlay>::iterator &it) {
10741074
if (objectTable[it->objIdx].frame < 0) {
10751075
break;
10761076
}
1077-
sprite = animDataTable + objectTable[it->objIdx].frame;
1077+
sprite = &animDataTable[objectTable[it->objIdx].frame];
10781078
len = sprite->_realWidth * sprite->_height;
10791079
mask = new byte[len];
10801080
generateMask(sprite->data(), mask, len, objectTable[it->objIdx].part);
@@ -1108,7 +1108,7 @@ void OSRenderer::renderOverlay(const Common::List<overlay>::iterator &it) {
11081108
assert(it->objIdx < NUM_MAX_OBJECT);
11091109
var5 = it->x; // A global variable updated here!
11101110
obj = &objectTable[it->objIdx];
1111-
sprite = animDataTable + obj->frame;
1111+
sprite = &animDataTable[obj->frame];
11121112

11131113
if (obj->frame < 0 || it->x < 0 || it->x > 8 || !_bgTable[it->x].bg || sprite->_bpp != 1) {
11141114
break;

0 commit comments

Comments
 (0)