aboutsummaryrefslogtreecommitdiff
path: root/src/common/Collision/Maps/MapTree.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-07-06 22:52:11 +0200
committerShauren <shauren.trinity@gmail.com>2024-07-06 22:52:11 +0200
commitd05dbaaecbd4bf7e1c0fd32d0fef34341b4067f6 (patch)
tree7a8e1958ea7e0dabe64700f17021c024c2972ad9 /src/common/Collision/Maps/MapTree.cpp
parent518fe1fd1ecf107e11336c4a41ed90405b115dc0 (diff)
Core/Vmaps: Fixed use after free and deadlocks when loading a model file fails
Diffstat (limited to 'src/common/Collision/Maps/MapTree.cpp')
-rw-r--r--src/common/Collision/Maps/MapTree.cpp45
1 files changed, 23 insertions, 22 deletions
diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp
index b168134486f..bde07b30065 100644
--- a/src/common/Collision/Maps/MapTree.cpp
+++ b/src/common/Collision/Maps/MapTree.cpp
@@ -335,12 +335,13 @@ namespace VMAP
{
TC_LOG_ERROR("maps", "StaticMapTree::LoadMapTile() : invalid tree element (spawn {}) referenced in tile {} by map {}", spawn.ID, fileResult.Name, iMapID);
result = LoadResult::ReadFromFileFailed;
- break;
+ continue;
}
if (referencedVal >= iTreeValues.size())
{
TC_LOG_ERROR("maps", "StaticMapTree::LoadMapTile() : invalid tree element ({}/{}) referenced in tile {}", referencedVal, iTreeValues.size(), fileResult.Name);
+ result = LoadResult::ReadFromFileFailed;
continue;
}
@@ -404,29 +405,29 @@ namespace VMAP
{
// read model spawns
ModelSpawn spawn;
- result = ModelSpawn::readFromFile(fileResult.TileFile.get(), spawn);
- if (result)
+ if (!ModelSpawn::readFromFile(fileResult.TileFile.get(), spawn))
+ break;
+
+ // update tree
+ uint32 referencedNode = 0;
+ if (fread(&referencedNode, sizeof(uint32), 1, fileResult.SpawnIndicesFile.get()) != 1)
{
- // update tree
- uint32 referencedNode = 0;
- if (fread(&referencedNode, sizeof(uint32), 1, fileResult.SpawnIndicesFile.get()) != 1)
- {
- TC_LOG_ERROR("maps", "StaticMapTree::LoadMapTile() : invalid tree element (spawn {}) referenced in tile {} by map {}", spawn.ID, fileResult.Name, iMapID);
- result = false;
- break;
- }
-
- if (referencedNode >= iTreeValues.size())
- {
- TC_LOG_ERROR("maps", "StaticMapTree::LoadMapTile() : invalid tree element ({}/{}) referenced in tile {}", referencedNode, iTreeValues.size(), fileResult.Name);
- continue;
- }
-
- if (!iTreeValues[referencedNode].getWorldModel())
- TC_LOG_ERROR("misc", "StaticMapTree::UnloadMapTile() : trying to unload non-referenced model '{}' (ID:{})", spawn.name, spawn.ID);
- else if (!iTreeValues[referencedNode].RemoveTileReference())
- iTreeValues[referencedNode].setUnloaded();
+ TC_LOG_ERROR("maps", "StaticMapTree::LoadMapTile() : invalid tree element (spawn {}) referenced in tile {} by map {}", spawn.ID, fileResult.Name, iMapID);
+ result = false;
+ continue;
+ }
+
+ if (referencedNode >= iTreeValues.size())
+ {
+ TC_LOG_ERROR("maps", "StaticMapTree::LoadMapTile() : invalid tree element ({}/{}) referenced in tile {}", referencedNode, iTreeValues.size(), fileResult.Name);
+ result = false;
+ continue;
}
+
+ if (!iTreeValues[referencedNode].getWorldModel())
+ TC_LOG_ERROR("misc", "StaticMapTree::UnloadMapTile() : trying to unload non-referenced model '{}' (ID:{})", spawn.name, spawn.ID);
+ else if (!iTreeValues[referencedNode].RemoveTileReference())
+ iTreeValues[referencedNode].setUnloaded();
}
}
}