[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