[Scummvm-git-logs] scummvm master -> c3f2565543b2419745889516780e80ce132fe310
bluegr
noreply at scummvm.org
Sat Sep 21 10:53:12 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
c3f2565543 SCUMM: Fix memory leaks on restart
Commit: c3f2565543b2419745889516780e80ce132fe310
https://github.com/scummvm/scummvm/commit/c3f2565543b2419745889516780e80ce132fe310
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-09-21T13:53:09+03:00
Commit Message:
SCUMM: Fix memory leaks on restart
Changed paths:
engines/scumm/he/resource_he.cpp
engines/scumm/resource.cpp
engines/scumm/resource_v4.cpp
engines/scumm/scumm.cpp
engines/scumm/util.cpp
engines/scumm/util.h
diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp
index 07d8d47d61c..aef61c6d5d5 100644
--- a/engines/scumm/he/resource_he.cpp
+++ b/engines/scumm/he/resource_he.cpp
@@ -25,6 +25,7 @@
#include "scumm/resource.h"
#include "scumm/he/resource_he.h"
#include "scumm/he/sound_he.h"
+#include "scumm/util.h"
#include "audio/decoders/wave.h"
#include "graphics/cursorman.h"
@@ -286,7 +287,7 @@ void ScummEngine_v99he::readMAXS(int blockSize) {
_numTalkies = _fileHandle->readUint16LE();
_numNewNames = 10;
- _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
+ _objectRoomTable = (byte *)reallocateArray(_objectRoomTable, _numGlobalObjects, 1);
_numGlobalScripts = 2048;
} else
ScummEngine_v90he::readMAXS(blockSize);
@@ -320,7 +321,7 @@ void ScummEngine_v90he::readMAXS(int blockSize) {
_numNewNames = 10;
- _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
+ _objectRoomTable = (byte *)reallocateArray(_objectRoomTable, _numGlobalObjects, 1);
if (_game.features & GF_HE_985)
_numGlobalScripts = 2048;
else
@@ -349,7 +350,7 @@ void ScummEngine_v72he::readMAXS(int blockSize) {
_numImages = _fileHandle->readUint16LE();
_numNewNames = 10;
- _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
+ _objectRoomTable = (byte *)reallocateArray(_objectRoomTable, _numGlobalObjects, 1);
_numGlobalScripts = 200;
} else
ScummEngine_v6::readMAXS(blockSize);
diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp
index 8bf3b535c74..6a407963f99 100644
--- a/engines/scumm/resource.cpp
+++ b/engines/scumm/resource.cpp
@@ -386,13 +386,13 @@ void ScummEngine_v70he::readIndexBlock(uint32 blocktype, uint32 itemsize) {
case MKTAG('D','L','F','L'):
i = _fileHandle->readUint16LE();
_fileHandle->seek(-2, SEEK_CUR);
- _heV7RoomOffsets = (byte *)calloc(2 + (i * 4), 1);
+ _heV7RoomOffsets = (byte *)reallocateArray(_heV7RoomOffsets, 2 + (i * 4), 1);
_fileHandle->read(_heV7RoomOffsets, (2 + (i * 4)) );
break;
case MKTAG('D','I','S','K'):
i = _fileHandle->readUint16LE();
- _heV7DiskOffsets = (byte *)calloc(i, 1);
+ _heV7DiskOffsets = (byte *)reallocateArray(_heV7DiskOffsets, i, 1);
_fileHandle->read(_heV7DiskOffsets, i);
break;
@@ -1227,7 +1227,7 @@ void ScummEngine_v5::readMAXS(int blockSize) {
_numFlObject = 50;
if (_shadowPaletteSize)
- _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1);
+ _shadowPalette = (byte *)reallocateArray(_shadowPalette, _shadowPaletteSize, 1);
}
#ifdef ENABLE_SCUMM_7_8
@@ -1252,11 +1252,11 @@ void ScummEngine_v8::readMAXS(int blockSize) {
_numArray = _fileHandle->readUint32LE(); // 200
_numVerbs = _fileHandle->readUint32LE(); // 50
- _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
+ _objectRoomTable = (byte *)reallocateArray(_objectRoomTable, _numGlobalObjects, 1);
_numGlobalScripts = 2000;
_shadowPaletteSize = NUM_SHADOW_PALETTE * 256;
- _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1);
+ _shadowPalette = (byte *)reallocateArray(_shadowPalette, _shadowPaletteSize, 1);
}
void ScummEngine_v7::readMAXS(int blockSize) {
@@ -1278,7 +1278,7 @@ void ScummEngine_v7::readMAXS(int blockSize) {
_numCharsets = _fileHandle->readUint16LE();
_numCostumes = _fileHandle->readUint16LE();
- _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
+ _objectRoomTable = (byte *)reallocateArray(_objectRoomTable, _numGlobalObjects, 1);
if ((_game.id == GID_FT) && (_game.features & GF_DEMO) &&
(_game.platform == Common::kPlatformDOS))
@@ -1287,7 +1287,7 @@ void ScummEngine_v7::readMAXS(int blockSize) {
_numGlobalScripts = 2000;
_shadowPaletteSize = NUM_SHADOW_PALETTE * 256;
- _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1);
+ _shadowPalette = (byte *)reallocateArray(_shadowPalette, _shadowPaletteSize, 1);
}
#endif
@@ -1314,12 +1314,12 @@ void ScummEngine_v6::readMAXS(int blockSize) {
_numGlobalScripts = 200;
if (_game.heversion >= 70) {
- _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1);
+ _objectRoomTable = (byte *)reallocateArray(_objectRoomTable, _numGlobalObjects, 1);
}
if (_game.heversion <= 70) {
_shadowPaletteSize = 256;
- _shadowPalette = (byte *)calloc(_shadowPaletteSize, 1);
+ _shadowPalette = (byte *)reallocateArray(_shadowPalette, _shadowPaletteSize, 1);
}
} else
error("readMAXS(%d) failed to read MAXS data", blockSize);
@@ -1399,19 +1399,19 @@ void ScummEngine::allocateArrays() {
// Note: Buffers are now allocated in scummMain to allow for
// early GUI init.
- _objectOwnerTable = (byte *)calloc(_numGlobalObjects, 1);
- _objectStateTable = (byte *)calloc(_numGlobalObjects, 1);
- _classData = (uint32 *)calloc(_numGlobalObjects, sizeof(uint32));
- _newNames = (uint16 *)calloc(_numNewNames, sizeof(uint16));
-
- _inventory = (uint16 *)calloc(_numInventory, sizeof(uint16));
- _verbs = (VerbSlot *)calloc(_numVerbs, sizeof(VerbSlot));
- _objs = (ObjectData *)calloc(_numLocalObjects, sizeof(ObjectData));
- _roomVars = (int32 *)calloc(_numRoomVariables, sizeof(int32));
- _scummVars = (int32 *)calloc(_numVariables, sizeof(int32));
- _bitVars = (byte *)calloc(_numBitVariables >> 3, 1);
+ _objectOwnerTable = (byte *)reallocateArray(_objectOwnerTable, _numGlobalObjects, 1);
+ _objectStateTable = (byte *)reallocateArray(_objectStateTable, _numGlobalObjects, 1);
+ _classData = (uint32 *)reallocateArray(_classData, _numGlobalObjects, sizeof(uint32));
+ _newNames = (uint16 *)reallocateArray(_newNames, _numNewNames, sizeof(uint16));
+
+ _inventory = (uint16 *)reallocateArray(_inventory, _numInventory, sizeof(uint16));
+ _verbs = (VerbSlot *)reallocateArray(_verbs, _numVerbs, sizeof(VerbSlot));
+ _objs = (ObjectData *)reallocateArray(_objs, _numLocalObjects, sizeof(ObjectData));
+ _roomVars = (int32 *)reallocateArray(_roomVars, _numRoomVariables, sizeof(int32));
+ _scummVars = (int32 *)reallocateArray(_scummVars, _numVariables, sizeof(int32));
+ _bitVars = (byte *)reallocateArray(_bitVars, _numBitVariables >> 3, 1);
if (_game.heversion >= 60) {
- _arraySlot = (byte *)calloc(_numArray, 1);
+ _arraySlot = (byte *)reallocateArray(_arraySlot, _numArray, 1);
}
_res->allocResTypeData(rtCostume, (_game.features & GF_NEW_COSTUMES) ? MKTAG('A','K','O','S') : MKTAG('C','O','S','T'),
@@ -1439,7 +1439,7 @@ void ScummEngine_v70he::allocateArrays() {
ScummEngine::allocateArrays();
_res->allocResTypeData(rtSpoolBuffer, 0, 9, kStaticResTypeMode);
- _heV7RoomIntOffsets = (uint32 *)calloc(_numRooms, sizeof(uint32));
+ _heV7RoomIntOffsets = (uint32 *)reallocateArray(_heV7RoomIntOffsets, _numRooms, sizeof(uint32));
}
diff --git a/engines/scumm/resource_v4.cpp b/engines/scumm/resource_v4.cpp
index 748bf465ed1..54daef33968 100644
--- a/engines/scumm/resource_v4.cpp
+++ b/engines/scumm/resource_v4.cpp
@@ -235,7 +235,7 @@ void ScummEngine_v4::readMAXS(int blockSize) {
_shadowPaletteSize = 256;
- _shadowPalette = (byte *) calloc(_shadowPaletteSize, 1); // FIXME - needs to be removed later
+ _shadowPalette = (byte *)reallocateArray(_shadowPalette, _shadowPaletteSize, 1); // FIXME - needs to be removed later
}
void ScummEngine_v4::readGlobalObjects() {
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 16c7cfca4e8..9d9e7572286 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -1729,12 +1729,12 @@ void ScummEngine::resetScumm() {
|| (_game.platform == Common::kPlatformFMTowns)
#endif
)
- _16BitPalette = (uint16 *)calloc(512, sizeof(uint16));
+ _16BitPalette = (uint16 *)reallocateArray(_16BitPalette, 512, sizeof(uint16));
#endif
// Indy4 Amiga needs another palette map for the verb area.
if (_game.platform == Common::kPlatformAmiga && _game.id == GID_INDY4 && !_verbPalette)
- _verbPalette = (uint8 *)calloc(256, 1);
+ _verbPalette = (uint8 *)reallocateArray(_verbPalette, 256, 1);
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
if (_game.platform == Common::kPlatformFMTowns) {
@@ -2037,8 +2037,7 @@ void ScummEngine_v99he::resetScumm() {
ScummEngine_v90he::resetScumm();
_hePaletteSlot = (_game.features & GF_16BIT_COLOR) ? 1280 : 1024;
- _hePalettes = (uint8 *)malloc((_numPalettes + 1) * _hePaletteSlot);
- memset(_hePalettes, 0, (_numPalettes + 1) * _hePaletteSlot);
+ _hePalettes = (uint8 *)reallocateArray(_hePalettes, (_numPalettes + 1) * _hePaletteSlot, 1);
_isHE995 = (_game.features & GF_HE_995);
// Array 129 is set to base name
diff --git a/engines/scumm/util.cpp b/engines/scumm/util.cpp
index 45c714126b4..4f45f1fb5b5 100644
--- a/engines/scumm/util.cpp
+++ b/engines/scumm/util.cpp
@@ -98,4 +98,9 @@ int normalizeAngle(int dirType, int angle) {
return toSimpleDir(dirType, temp) * (dirType ? 45 : 90);
}
+void *reallocateArray(void *buffer, size_t count, size_t size) {
+ free(buffer);
+ return calloc(count, size);
+}
+
} // End of namespace Scumm
diff --git a/engines/scumm/util.h b/engines/scumm/util.h
index 3ac20ea025d..4680cb6030e 100644
--- a/engines/scumm/util.h
+++ b/engines/scumm/util.h
@@ -39,6 +39,8 @@ int toSimpleDir(int dirtype, int dir);
void assertRange(int min, int value, int max, const char *desc);
+void *reallocateArray(void *buffer, size_t count, size_t size);
+
} // End of namespace Scumm
#endif
More information about the Scummvm-git-logs
mailing list