From ee26c5886e98a3a1156579df2ffe4a7a33c2080e Mon Sep 17 00:00:00 2001 From: Mauller <26652186+Mauller@users.noreply.github.com> Date: Fri, 25 Apr 2025 21:22:01 +0100 Subject: [PATCH 1/2] Revert "[GEN][ZH] Refactor GameLogic::reset to avoid "vector subscript out of range" debug error (#645)" (#764) This reverts commit bbf0830cb5c108df183613056b319dfb0c35c124. --- .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 7 +++---- .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index b007a64907b..05aec222ba4 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -421,10 +421,6 @@ void GameLogic::reset( void ) m_thingTemplateBuildableOverrides.clear(); m_controlBarOverrides.clear(); - // destroy all objects - // TheSuperHackers @info xezon 10/04/2025 Objects need to be destroyed before clearing the object hash. - destroyAllObjectsImmediate(); - // set the hash to be rather large. We need to optimize this value later. m_objHash.clear(); #if USING_STLPORT @@ -437,6 +433,9 @@ void GameLogic::reset( void ) m_mouseVisibleMemory = TRUE; setFPMode(); + // destroy all objects + destroyAllObjectsImmediate(); + m_nextObjID = (ObjectID)1; m_frameObjectsChangedTriggerAreas = 0; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index bf74873267d..980f69d205e 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -436,10 +436,6 @@ void GameLogic::reset( void ) m_thingTemplateBuildableOverrides.clear(); m_controlBarOverrides.clear(); - // destroy all objects - // TheSuperHackers @info xezon 10/04/2025 Objects need to be destroyed before clearing the object vector. - destroyAllObjectsImmediate(); - // set the hash to be rather large. We need to optimize this value later. // m_objHash.clear(); // m_objHash.resize(OBJ_HASH_SIZE); @@ -451,6 +447,9 @@ void GameLogic::reset( void ) m_mouseVisibleMemory = TRUE; setFPMode(); + // destroy all objects + destroyAllObjectsImmediate(); + m_nextObjID = (ObjectID)1; m_frameObjectsChangedTriggerAreas = 0; From 74a18e47dd29a23b43d530a360731312db50866a Mon Sep 17 00:00:00 2001 From: Mauller <26652186+Mauller@users.noreply.github.com> Date: Fri, 25 Apr 2025 21:26:44 +0100 Subject: [PATCH 2/2] [ZH] Add range check in removeDrawableFromLookupTable and removeObjectFromLookupTable (#764) --- GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp | 3 ++- .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp index 21be7ea196a..17004623c97 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp @@ -878,7 +878,8 @@ void GameClient::removeDrawableFromLookupTable( Drawable *draw ) { // sanity - if( draw == NULL ) + // TheSuperHackers @fix Mauller/Xezon 24/04/2025 Prevent out of range access to vector lookup table + if( draw == NULL || static_cast(draw->getID()) >= m_drawableVector.size() ) return; // remove from table diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 980f69d205e..3cf940f56af 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3882,7 +3882,8 @@ void GameLogic::removeObjectFromLookupTable( Object *obj ) { // sanity - if( obj == NULL ) + // TheSuperHackers @fix Mauller/Xezon 24/04/2025 Prevent out of range access to vector lookup table + if( obj == NULL || static_cast(obj->getID()) >= m_objVector.size() ) return; // remove from lookup table