From 0be8c37d343afa5af962db134dbe3cc7165703a3 Mon Sep 17 00:00:00 2001 From: stm <14291421+stephanmeesters@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:14:56 +0100 Subject: [PATCH] fix: Fix possible null pointer deferencing in GameLogicDispatch --- Generals/Code/GameEngine/Include/GameLogic/AI.h | 2 +- Generals/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp | 2 +- .../GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp | 4 ++-- GeneralsMD/Code/GameEngine/Include/GameLogic/AI.h | 2 +- GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp | 2 +- .../GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/AI.h b/Generals/Code/GameEngine/Include/GameLogic/AI.h index 82e2934d1c5..304991bbe78 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/AI.h +++ b/Generals/Code/GameEngine/Include/GameLogic/AI.h @@ -945,7 +945,7 @@ class AIGroup : public MemoryPoolObject, public Snapshot void computeIndividualDestination( Coord3D *dest, const Coord3D *groupDest, Object *obj, const Coord3D *center, Bool isFormation ); ///< compute destination of individual object, based on group destination Int getCount(); ///< return the number of objects in the group - Bool isEmpty(); ///< returns true if the group has no members + Bool isEmpty() const; ///< returns true if the group has no members void queueUpgrade( const UpgradeTemplate *upgrade ); ///< queue an upgrade void add( Object *obj ); ///< add object to group diff --git a/Generals/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp b/Generals/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp index e849aaf5cc3..39f78bc9a4a 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp @@ -502,7 +502,7 @@ Int AIGroup::getCount() /** * Returns true if the group has no members */ -Bool AIGroup::isEmpty() +Bool AIGroup::isEmpty() const { return m_memberList.empty(); } diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index 14e3a2dffc1..e7b8ed858aa 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -207,7 +207,7 @@ static void doSetRallyPoint( Object *obj, const Coord3D& pos ) static Object * getSingleObjectFromSelection(const AIGroup *currentlySelectedGroup) { - if( currentlySelectedGroup ) + if( currentlySelectedGroup && !currentlySelectedGroup->isEmpty() ) { const VecObjectID& selectedObjects = currentlySelectedGroup->getAllIDs(); DEBUG_ASSERTCRASH(selectedObjects.size() == 1, ("Trying to get single object from multiple selection!")); @@ -532,7 +532,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) Object *targetObject = findObjectByID( msg->getArgument( 0 )->objectID ); // issue command for either single object or for selected group - if( currentlySelectedGroup ) + if( currentlySelectedGroup && targetObject ) currentlySelectedGroup->groupCombatDrop( targetObject, *targetObject->getPosition(), CMD_FROM_PLAYER ); diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/AI.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/AI.h index 3486e9b0b85..87d3c1302d0 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/AI.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/AI.h @@ -984,7 +984,7 @@ class AIGroup : public MemoryPoolObject, public Snapshot void computeIndividualDestination( Coord3D *dest, const Coord3D *groupDest, Object *obj, const Coord3D *center, Bool isFormation ); ///< compute destination of individual object, based on group destination Int getCount(); ///< return the number of objects in the group - Bool isEmpty(); ///< returns true if the group has no members + Bool isEmpty() const; ///< returns true if the group has no members void queueUpgrade( const UpgradeTemplate *upgrade ); ///< queue an upgrade void add( Object *obj ); ///< add object to group diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp index 87e6dfae833..fbcc7cf02fb 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AIGroup.cpp @@ -502,7 +502,7 @@ Int AIGroup::getCount() /** * Returns true if the group has no members */ -Bool AIGroup::isEmpty() +Bool AIGroup::isEmpty() const { return m_memberList.empty(); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp index 291d269f276..011139628a2 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp @@ -208,7 +208,7 @@ static void doSetRallyPoint( Object *obj, const Coord3D& pos ) static Object * getSingleObjectFromSelection(const AIGroup *currentlySelectedGroup) { - if( currentlySelectedGroup ) + if( currentlySelectedGroup && !currentlySelectedGroup->isEmpty() ) { const VecObjectID& selectedObjects = currentlySelectedGroup->getAllIDs(); DEBUG_ASSERTCRASH(selectedObjects.size() == 1, ("Trying to get single object from multiple selection!")); @@ -541,7 +541,7 @@ void GameLogic::logicMessageDispatcher( GameMessage *msg, void *userData ) Object *targetObject = findObjectByID( msg->getArgument( 0 )->objectID ); // issue command for either single object or for selected group - if( currentlySelectedGroup ) + if( currentlySelectedGroup && targetObject ) currentlySelectedGroup->groupCombatDrop( targetObject, *targetObject->getPosition(), CMD_FROM_PLAYER );