diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-07-06 22:52:11 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-07-06 22:59:34 +0200 |
commit | 120bea629ddf1bea2fae340f3422b8b6e477a709 (patch) | |
tree | 6740eb9b56a22c827803f29600331c5632c6e613 /src/common/Collision/Maps/MapTree.cpp | |
parent | 0fe73dc2b6527b7f0088ac310679d1c9e9c630ff (diff) |
Core/Vmaps: Fixed use after free and deadlocks when loading a model file fails
(cherry picked from commit d05dbaaecbd4bf7e1c0fd32d0fef34341b4067f6)
Diffstat (limited to 'src/common/Collision/Maps/MapTree.cpp')
-rw-r--r-- | src/common/Collision/Maps/MapTree.cpp | 45 |
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(); } } } |