diff options
author | D G Turner | 2011-03-01 07:37:26 +0000 |
---|---|---|
committer | D G Turner | 2011-03-01 07:37:26 +0000 |
commit | 22ebc2b724df5d8d717dec0d225e802d57514f79 (patch) | |
tree | 10ab980c7eb62fbf8308343bbc363cd83a39781c | |
parent | 95b1bfa0bee99f6ab6396b463ad188b3c0ade31c (diff) | |
download | scummvm-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.cpp | 35 |
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; + } + } } } |