aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorD G Turner2011-03-01 07:37:26 +0000
committerD G Turner2011-03-01 07:37:26 +0000
commit22ebc2b724df5d8d717dec0d225e802d57514f79 (patch)
tree10ab980c7eb62fbf8308343bbc363cd83a39781c
parent95b1bfa0bee99f6ab6396b463ad188b3c0ade31c (diff)
downloadscummvm-rg350-22ebc2b724df5d8d717dec0d225e802d57514f79.tar.gz
scummvm-rg350-22ebc2b724df5d8d717dec0d225e802d57514f79.tar.bz2
scummvm-rg350-22ebc2b724df5d8d717dec0d225e802d57514f79.zip
HUGO: Correct 2 Memory Leaks in DAT Object Loading.
-rw-r--r--engines/hugo/object.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp
index 04e3449cbb..f82a6a53c6 100644
--- a/engines/hugo/object.cpp
+++ b/engines/hugo/object.cpp
@@ -418,20 +418,25 @@ void ObjectHandler::readUse(Common::ReadStream &in, uses_t &curUse) {
*/
void ObjectHandler::loadObjectUses(Common::ReadStream &in) {
uses_t tmpUse;
+ tmpUse.targets = 0;
+
//Read _uses
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
- tmpUse.targets = 0;
uint16 numElem = in.readUint16BE();
if (varnt == _vm->_gameVariant) {
_usesSize = numElem;
_uses = (uses_t *)malloc(sizeof(uses_t) * numElem);
}
- for (int i = 0; i < numElem; i++)
- readUse(in, (varnt == _vm->_gameVariant) ? _uses[i] : tmpUse);
-
- if (tmpUse.targets)
- free(tmpUse.targets);
+ for (int i = 0; i < numElem; i++) {
+ if (varnt == _vm->_gameVariant)
+ readUse(in, _uses[i]);
+ else {
+ readUse(in, tmpUse);
+ free(tmpUse.targets);
+ tmpUse.targets = 0;
+ }
+ }
}
}
@@ -497,20 +502,26 @@ void ObjectHandler::readObject(Common::ReadStream &in, object_t &curObject) {
void ObjectHandler::loadObjectArr(Common::ReadStream &in) {
debugC(6, kDebugObject, "loadObject(&in)");
object_t tmpObject;
+ tmpObject.stateDataIndex = 0;
for (int varnt = 0; varnt < _vm->_numVariant; varnt++) {
uint16 numElem = in.readUint16BE();
- tmpObject.stateDataIndex = 0;
+
if (varnt == _vm->_gameVariant) {
_objCount = numElem;
_objects = (object_t *)malloc(sizeof(object_t) * numElem);
}
- for (int i = 0; i < numElem; i++)
- readObject(in, (varnt == _vm->_gameVariant) ? _objects[i] : tmpObject);
-
- if (tmpObject.stateDataIndex)
- free(tmpObject.stateDataIndex);
+ for (int i = 0; i < numElem; i++) {
+ if (varnt == _vm->_gameVariant)
+ readObject(in, _objects[i]);
+ else {
+ // Skip over uneeded objects.
+ readObject(in, tmpObject);
+ free(tmpObject.stateDataIndex);
+ tmpObject.stateDataIndex = 0;
+ }
+ }
}
}