From d002800b52fb1d9325520a8b95510b974f6139b7 Mon Sep 17 00:00:00 2001 From: Arnaud Boutonné Date: Tue, 9 Nov 2010 20:26:12 +0000 Subject: HUGO: Fix several memory leaks svn-id: r54168 --- engines/hugo/file.cpp | 6 ++++-- engines/hugo/file_v1d.cpp | 8 +++++--- engines/hugo/file_v2d.cpp | 5 +++-- engines/hugo/file_v3d.cpp | 7 ++++--- engines/hugo/hugo.cpp | 37 ++++++++++++++++++++++++++----------- engines/hugo/object.cpp | 2 ++ engines/hugo/schedule.cpp | 7 ++++++- 7 files changed, 50 insertions(+), 22 deletions(-) (limited to 'engines/hugo') 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); } } -- cgit v1.2.3