diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-07-06 22:52:11 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-07-06 22:52:11 +0200 |
commit | d05dbaaecbd4bf7e1c0fd32d0fef34341b4067f6 (patch) | |
tree | 7a8e1958ea7e0dabe64700f17021c024c2972ad9 /src/common/Collision/Maps/MapTree.cpp | |
parent | 518fe1fd1ecf107e11336c4a41ed90405b115dc0 (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.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(); } } } |