[Scummvm-cvs-logs] SF.net SVN: scummvm:[54168] scummvm/trunk/engines/hugo
strangerke at users.sourceforge.net
strangerke at users.sourceforge.net
Tue Nov 9 21:26:12 CET 2010
Revision: 54168
http://scummvm.svn.sourceforge.net/scummvm/?rev=54168&view=rev
Author: strangerke
Date: 2010-11-09 20:26:12 +0000 (Tue, 09 Nov 2010)
Log Message:
-----------
HUGO: Fix several memory leaks
Modified Paths:
--------------
scummvm/trunk/engines/hugo/file.cpp
scummvm/trunk/engines/hugo/file_v1d.cpp
scummvm/trunk/engines/hugo/file_v2d.cpp
scummvm/trunk/engines/hugo/file_v3d.cpp
scummvm/trunk/engines/hugo/hugo.cpp
scummvm/trunk/engines/hugo/object.cpp
scummvm/trunk/engines/hugo/schedule.cpp
Modified: scummvm/trunk/engines/hugo/file.cpp
===================================================================
--- scummvm/trunk/engines/hugo/file.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/file.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -167,6 +167,7 @@
if (!_objectsArchive.open(buf))
Utils::Error(FILE_ERR, "%s", buf);
}
+ free(buf);
}
bool firstFl = true; // Initializes pcx read function
@@ -612,10 +613,11 @@
ip.seek(UIFHeaderPtr->offset, SEEK_SET);
// We support pcx images and straight data
- seq_t dummySeq; // Dummy seq_t for image data
+ seq_t *dummySeq; // Dummy seq_t for image data
switch (id) {
case UIF_IMAGES: // Read uif images file
- readPCX(ip, &dummySeq, buf, true, UIF_FILE);
+ dummySeq = readPCX(ip, 0, buf, true, UIF_FILE);
+ free(dummySeq);
break;
default: // Read file data into supplied array
if (ip.read(buf, UIFHeaderPtr->size) != UIFHeaderPtr->size)
Modified: scummvm/trunk/engines/hugo/file_v1d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/file_v1d.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/file_v1d.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -76,6 +76,7 @@
_sceneryArchive1.read(tmpImage, OVL_SIZE);
_sceneryArchive1.close();
+ free(buf);
}
/**
@@ -89,10 +90,11 @@
if (!_sceneryArchive1.open(buf))
Utils::Error(FILE_ERR, "%s", buf);
// Read the image into dummy seq and static dib_a
- seq_t dummySeq; // Image sequence structure for Read_pcx
- readPCX(_sceneryArchive1, &dummySeq, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
-
+ seq_t *dummySeq; // Image sequence structure for Read_pcx
+ dummySeq = readPCX(_sceneryArchive1, 0, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
+ free(dummySeq);
_sceneryArchive1.close();
+ free(buf);
}
char *FileManager_v1d::fetchString(int index) {
Modified: scummvm/trunk/engines/hugo/file_v2d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/file_v2d.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/file_v2d.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -92,8 +92,9 @@
_sceneryArchive1.seek(sceneBlock.scene_off, SEEK_SET);
// Read the image into dummy seq and static dib_a
- seq_t dummySeq; // Image sequence structure for Read_pcx
- readPCX(_sceneryArchive1, &dummySeq, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
+ seq_t *dummySeq; // Image sequence structure for Read_pcx
+ dummySeq = readPCX(_sceneryArchive1, 0, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
+ free(dummySeq);
}
/**
Modified: scummvm/trunk/engines/hugo/file_v3d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/file_v3d.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/file_v3d.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -63,16 +63,17 @@
sceneBlock.ob_off = _sceneryArchive1.readUint32LE();
sceneBlock.ob_len = _sceneryArchive1.readUint32LE();
- seq_t dummySeq; // Image sequence structure for Read_pcx
+ seq_t *dummySeq; // Image sequence structure for Read_pcx
if (screenIndex < 20) {
_sceneryArchive1.seek(sceneBlock.scene_off, SEEK_SET);
// Read the image into dummy seq and static dib_a
- readPCX(_sceneryArchive1, &dummySeq, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
+ dummySeq = readPCX(_sceneryArchive1, 0, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
} else {
_sceneryArchive2.seek(sceneBlock.scene_off, SEEK_SET);
// Read the image into dummy seq and static dib_a
- readPCX(_sceneryArchive2, &dummySeq, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
+ dummySeq = readPCX(_sceneryArchive2, 0, _vm->_screen->getFrontBuffer(), true, _vm->_screenNames[screenIndex]);
}
+ free(dummySeq);
}
/**
Modified: scummvm/trunk/engines/hugo/hugo.cpp
===================================================================
--- scummvm/trunk/engines/hugo/hugo.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/hugo.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -83,8 +83,8 @@
}
HugoEngine::~HugoEngine() {
- free(_textData);
- free(_stringtData);
+ freeTexts(_textData);
+ freeTexts(_stringtData);
if (_arrayNouns) {
for (int i = 0; _arrayNouns[i]; i++)
@@ -98,17 +98,23 @@
free(_arrayVerbs);
}
- free(_screenNames);
+ freeTexts(_screenNames);
_screen->freePalette();
- free(_textEngine);
- free(_textIntro);
+ freeTexts(_textEngine);
+ freeTexts(_textIntro);
free(_introX);
free(_introY);
- free(_textMouse);
- free(_textParser);
- free(_textSchedule);
- free(_textUtil);
- free(_arrayReqs);
+ freeTexts(_textMouse);
+ freeTexts(_textParser);
+ freeTexts(_textSchedule);
+ freeTexts(_textUtil);
+
+ if (_arrayReqs) {
+ for (int i = 0; _arrayReqs[i] != 0; i++)
+ free(_arrayReqs[i]);
+ free(_arrayReqs);
+ }
+
free(_hotspots);
free(_invent);
@@ -751,6 +757,7 @@
int len;
char **res = 0;
char *pos = 0;
+ char *posBck = 0;
for (int varnt = 0; varnt < _numVariant; varnt++) {
numTexts = in.readUint16BE();
@@ -765,6 +772,7 @@
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ posBck = pos;
}
pos += DATAALIGNMENT;
@@ -778,6 +786,9 @@
if (varnt == _gameVariant)
res[i] = pos;
}
+
+ if (varnt != _gameVariant)
+ free(posBck);
}
return res;
@@ -822,6 +833,7 @@
int numTexts = in.readUint16BE();
int entryLen = in.readUint16BE();
char *pos = (char *)malloc(entryLen);
+ char *posBck = 0;
char **res = 0;
if (varnt == _gameVariant) {
res = (char **)malloc(sizeof(char *) * numTexts);
@@ -830,6 +842,7 @@
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ posBck = pos;
}
pos += DATAALIGNMENT;
@@ -845,6 +858,8 @@
if (varnt == _gameVariant)
resArray[i] = res;
+ else
+ free(posBck);
}
}
@@ -876,7 +891,7 @@
if (!ptr)
return;
- free(*ptr);
+ free(*ptr - DATAALIGNMENT);
free(ptr);
}
Modified: scummvm/trunk/engines/hugo/object.cpp
===================================================================
--- scummvm/trunk/engines/hugo/object.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/object.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -218,6 +218,8 @@
object_t *obj = &_objects[i];
for (int j = 0; j < obj->seqNumb; j++) { // for each sequence
seq_t *seq = obj->seqList[j].seqPtr; // Free image
+ if (obj->currImagePtr!= 0)
+ free(obj->currImagePtr);
if (seq == 0) // Failure during database load
break;
do {
Modified: scummvm/trunk/engines/hugo/schedule.cpp
===================================================================
--- scummvm/trunk/engines/hugo/schedule.cpp 2010-11-09 19:37:42 UTC (rev 54167)
+++ scummvm/trunk/engines/hugo/schedule.cpp 2010-11-09 20:26:12 UTC (rev 54168)
@@ -830,8 +830,13 @@
debugC(6, kDebugSchedule, "freeActListArr()");
if (_actListArr) {
- for (int i = 0; i < _actListArrSize; i++)
+ for (int i = 0; i < _actListArrSize; i++) {
+ for (int j = 0; _actListArr[i][j].a0.actType != ANULL; j++) {
+ if (_actListArr[i][j].a0.actType == PROMPT)
+ free(_actListArr[i][j].a3.responsePtr);
+ }
free(_actListArr[i]);
+ }
free(_actListArr);
}
}
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