aboutsummaryrefslogtreecommitdiff
path: root/engines/hugo
diff options
context:
space:
mode:
authorArnaud Boutonné2010-11-09 20:26:12 +0000
committerArnaud Boutonné2010-11-09 20:26:12 +0000
commitd002800b52fb1d9325520a8b95510b974f6139b7 (patch)
treee85670278aee4519280c4f8d182801faf4275903 /engines/hugo
parent1a85ce8e036a292b3d2569d8044b787e76ce48f9 (diff)
downloadscummvm-rg350-d002800b52fb1d9325520a8b95510b974f6139b7.tar.gz
scummvm-rg350-d002800b52fb1d9325520a8b95510b974f6139b7.tar.bz2
scummvm-rg350-d002800b52fb1d9325520a8b95510b974f6139b7.zip
HUGO: Fix several memory leaks
svn-id: r54168
Diffstat (limited to 'engines/hugo')
-rw-r--r--engines/hugo/file.cpp6
-rw-r--r--engines/hugo/file_v1d.cpp8
-rw-r--r--engines/hugo/file_v2d.cpp5
-rw-r--r--engines/hugo/file_v3d.cpp7
-rw-r--r--engines/hugo/hugo.cpp37
-rw-r--r--engines/hugo/object.cpp2
-rw-r--r--engines/hugo/schedule.cpp7
7 files changed, 50 insertions, 22 deletions
diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp
index c3e59b19c9..48e68a7099 100644
--- a/engines/hugo/file.cpp
+++ b/engines/hugo/file.cpp
@@ -167,6 +167,7 @@ void FileManager::readImage(int objNum, object_t *objPtr) {
if (!_objectsArchive.open(buf))
Utils::Error(FILE_ERR, "%s", buf);
}
+ free(buf);
}
bool firstFl = true; // Initializes pcx read function
@@ -612,10 +613,11 @@ void FileManager::readUIFItem(int16 id, byte *buf) {
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)
diff --git a/engines/hugo/file_v1d.cpp b/engines/hugo/file_v1d.cpp
index 059f1a25b7..a62d0f39e6 100644
--- a/engines/hugo/file_v1d.cpp
+++ b/engines/hugo/file_v1d.cpp
@@ -76,6 +76,7 @@ void FileManager_v1d::readOverlay(int screenNum, image_pt image, ovl_t overlayTy
_sceneryArchive1.read(tmpImage, OVL_SIZE);
_sceneryArchive1.close();
+ free(buf);
}
/**
@@ -89,10 +90,11 @@ void FileManager_v1d::readBackground(int screenIndex) {
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) {
diff --git a/engines/hugo/file_v2d.cpp b/engines/hugo/file_v2d.cpp
index a6f2ec6bb0..c8e94cb8ef 100644
--- a/engines/hugo/file_v2d.cpp
+++ b/engines/hugo/file_v2d.cpp
@@ -92,8 +92,9 @@ void FileManager_v2d::readBackground(int screenIndex) {
_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);
}
/**
diff --git a/engines/hugo/file_v3d.cpp b/engines/hugo/file_v3d.cpp
index e7af41b93f..312e2f7bc2 100644
--- a/engines/hugo/file_v3d.cpp
+++ b/engines/hugo/file_v3d.cpp
@@ -63,16 +63,17 @@ void FileManager_v3d::readBackground(int screenIndex) {
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);
}
/**
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index ef3352829d..445a8d7b25 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -83,8 +83,8 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy
}
HugoEngine::~HugoEngine() {
- free(_textData);
- free(_stringtData);
+ freeTexts(_textData);
+ freeTexts(_stringtData);
if (_arrayNouns) {
for (int i = 0; _arrayNouns[i]; i++)
@@ -98,17 +98,23 @@ HugoEngine::~HugoEngine() {
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 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
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 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ posBck = pos;
}
pos += DATAALIGNMENT;
@@ -778,6 +786,9 @@ char **HugoEngine::loadTextsVariante(Common::File &in, uint16 *arraySize) {
if (varnt == _gameVariant)
res[i] = pos;
}
+
+ if (varnt != _gameVariant)
+ free(posBck);
}
return res;
@@ -822,6 +833,7 @@ char ***HugoEngine::loadTextsArray(Common::File &in) {
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 @@ char ***HugoEngine::loadTextsArray(Common::File &in) {
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ posBck = pos;
}
pos += DATAALIGNMENT;
@@ -845,6 +858,8 @@ char ***HugoEngine::loadTextsArray(Common::File &in) {
if (varnt == _gameVariant)
resArray[i] = res;
+ else
+ free(posBck);
}
}
@@ -876,7 +891,7 @@ void HugoEngine::freeTexts(char **ptr) {
if (!ptr)
return;
- free(*ptr);
+ free(*ptr - DATAALIGNMENT);
free(ptr);
}
diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp
index 6aec9d1378..14585f0cd7 100644
--- a/engines/hugo/object.cpp
+++ b/engines/hugo/object.cpp
@@ -218,6 +218,8 @@ void ObjectHandler::freeObjects() {
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 {
diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp
index 6f88ce98bf..c368a1982d 100644
--- a/engines/hugo/schedule.cpp
+++ b/engines/hugo/schedule.cpp
@@ -830,8 +830,13 @@ void Scheduler::freeActListArr() {
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);
}
}