Core/Vmaps: Fixed use after free and deadlocks when loading a model file fails

Port From (https://github.com/TrinityCore/TrinityCore/commit/d05dbaaecbd4bf7e1c0fd32d0fef34341b4067f6)
This commit is contained in:
Hondacrx
2024-08-31 18:44:32 -04:00
parent a9a28c889e
commit 8b991e1a06
3 changed files with 29 additions and 26 deletions
+15 -15
View File
@@ -123,6 +123,7 @@ namespace Game.Collision
if (referencedVal >= iTreeValues.Length)
{
Log.outError(LogFilter.Maps, $"StaticMapTree::LoadMapTile() : invalid tree element ({referencedVal}/{iTreeValues.Length}) referenced in tile {fileResult.Name}");
result = LoadResult.ReadFromFileFailed;
continue;
}
@@ -175,23 +176,22 @@ namespace Game.Collision
for (uint i = 0; i < numSpawns && result; ++i)
{
// read model spawns
ModelSpawn spawn;
result = ModelSpawn.ReadFromFile(reader, out spawn);
if (result)
{
// update tree
int referencedNode = spawnIndicesReader.ReadInt32();
if (referencedNode >= iTreeValues.Length)
{
Log.outError(LogFilter.Maps, $"StaticMapTree::LoadMapTile() : invalid tree element ({referencedNode}/{iTreeValues.Length}) referenced in tile {fileResult.Name}");
continue;
}
if (!ModelSpawn.ReadFromFile(reader, out ModelSpawn spawn))
break;
if (iTreeValues[referencedNode].GetWorldModel() == null)
Log.outError(LogFilter.Misc, $"StaticMapTree::UnloadMapTile() : trying to unload non-referenced model '{spawn.name}' (ID:{spawn.Id})");
else if (iTreeValues[referencedNode].RemoveTileReference() == 0)
iTreeValues[referencedNode].SetUnloaded();
// update tree
int referencedNode = spawnIndicesReader.ReadInt32();
if (referencedNode >= iTreeValues.Length)
{
Log.outError(LogFilter.Maps, $"StaticMapTree::LoadMapTile() : invalid tree element ({referencedNode}/{iTreeValues.Length}) referenced in tile {fileResult.Name}");
result = false;
continue;
}
if (iTreeValues[referencedNode].GetWorldModel() == null)
Log.outError(LogFilter.Misc, $"StaticMapTree::UnloadMapTile() : trying to unload non-referenced model '{spawn.name}' (ID:{spawn.Id})");
else if (iTreeValues[referencedNode].RemoveTileReference() == 0)
iTreeValues[referencedNode].SetUnloaded();
}
}
}