From 5009dfafa69f98fe3d1aaab32bb7dfc619ede0e9 Mon Sep 17 00:00:00 2001 From: Okladnoj Date: Thu, 29 Oct 2026 22:45:00 +0200 Subject: [PATCH 1/2] bugfix(locomotor): Fix crash in LocomotorStore::reset when map.ini defines a new locomotor --- Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp | 3 ++- .../Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp index 2848113e67f..e91a13d93fd 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp @@ -653,7 +653,8 @@ void LocomotorStore::reset() Overridable *locoTemp = it->second->deleteOverrides(); if (!locoTemp) { - m_locomotorTemplates.erase(it); + // TheSuperHackers @bugfix Okladnoj 29/10/2026 Advance the iterator before erasing, so the loop does not visit the erased node again. + m_locomotorTemplates.erase(it++); } else { diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp index 17ec7f81eb0..0208062a2da 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp @@ -653,7 +653,8 @@ void LocomotorStore::reset() Overridable *locoTemp = it->second->deleteOverrides(); if (!locoTemp) { - m_locomotorTemplates.erase(it); + // TheSuperHackers @bugfix Okladnoj 29/10/2026 Advance the iterator before erasing, so the loop does not visit the erased node again. + m_locomotorTemplates.erase(it++); } else { From f0ac835c41eb5d52d1b238d203c45da60cea52a3 Mon Sep 17 00:00:00 2001 From: Okladnoj Date: Fri, 30 Oct 2026 01:43:26 +0200 Subject: [PATCH 2/2] refactor(locomotor): Remove the redundant comment above erase(it++) --- Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp | 1 - GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp index e91a13d93fd..c59ed7e99fd 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp @@ -653,7 +653,6 @@ void LocomotorStore::reset() Overridable *locoTemp = it->second->deleteOverrides(); if (!locoTemp) { - // TheSuperHackers @bugfix Okladnoj 29/10/2026 Advance the iterator before erasing, so the loop does not visit the erased node again. m_locomotorTemplates.erase(it++); } else diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp index 0208062a2da..1c0a957a072 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Locomotor.cpp @@ -653,7 +653,6 @@ void LocomotorStore::reset() Overridable *locoTemp = it->second->deleteOverrides(); if (!locoTemp) { - // TheSuperHackers @bugfix Okladnoj 29/10/2026 Advance the iterator before erasing, so the loop does not visit the erased node again. m_locomotorTemplates.erase(it++); } else