From 9c2c7e3529869cd3e053c19d1777178729149257 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Fri, 29 Jul 2022 04:34:23 +0300 Subject: [PATCH] game/server: fix some Asan issues --- game/server/ai_behavior_follow.cpp | 4 ++-- game/server/ai_network.cpp | 24 ++++++++++++++++++++++++ game/server/ai_network.h | 6 +++++- tier1/strtools.cpp | 3 +++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/game/server/ai_behavior_follow.cpp b/game/server/ai_behavior_follow.cpp index 0cedd2fa..a1ed5139 100644 --- a/game/server/ai_behavior_follow.cpp +++ b/game/server/ai_behavior_follow.cpp @@ -111,7 +111,7 @@ public: else { int result = 0; - for ( int i = pGroup->followers.Head(); i != pGroup->followers.InvalidIndex(); i = pGroup->followers.Next( i ) ) + for ( intp i = pGroup->followers.Head(); i != pGroup->followers.InvalidIndex(); i = pGroup->followers.Next( i ) ) { if ( pGroup->followers[i].hFollower && pGroup->followers[i].hFollower->ClassMatches( iszClassname ) ) { @@ -131,7 +131,7 @@ public: return 0; } - int h = pGroup->followers.Head(); + intp h = pGroup->followers.Head(); while( h != pGroup->followers.InvalidIndex() ) { diff --git a/game/server/ai_network.cpp b/game/server/ai_network.cpp index 78b7a53f..7a2e73ce 100644 --- a/game/server/ai_network.cpp +++ b/game/server/ai_network.cpp @@ -120,6 +120,8 @@ CAI_Network::CAI_Network() #ifdef AI_NODE_TREE m_pNodeTree = NULL; #endif + + gEntList.AddListenerEntity( this ); } //----------------------------------------------------------------------------- @@ -133,6 +135,9 @@ CAI_Network::~CAI_Network() m_pNodeTree = NULL; } #endif + + gEntList.RemoveListenerEntity( this ); + if ( m_pAInode ) { for ( int node = 0; node < m_iNumNodes; node++ ) @@ -642,3 +647,22 @@ IterationRetval_t CAI_Network::EnumElement( IHandleEntity *pHandleEntity ) } //============================================================================= + +void CAI_Network::OnEntityDeleted( CBaseEntity *pEntity ) +{ + if( pEntity->IsNPC() ) + return; + + const char *classname = pEntity->GetClassname(); + if( !classname || strcmp(classname, "ai_hint") != 0 ) + return; + + for( int i = 0; i < m_iNumNodes; i++) + { + if( m_pAInode[i]->GetHint() == (CAI_Hint*)pEntity ) + { + m_pAInode[i]->SetHint( NULL ); + break; + } + } +} diff --git a/game/server/ai_network.h b/game/server/ai_network.h index 8cebd16a..8378eef7 100644 --- a/game/server/ai_network.h +++ b/game/server/ai_network.h @@ -84,12 +84,14 @@ public: // Purpose: Stores a node graph through which an AI may pathfind //----------------------------------------------------------------------------- -class CAI_Network : public IPartitionEnumerator +class CAI_Network : public IPartitionEnumerator, public IEntityListener { public: CAI_Network(); ~CAI_Network(); + void OnEntityDeleted( CBaseEntity *pEntity ); + CAI_Node * AddNode( const Vector &origin, float yaw ); // Returns a new node in the network CAI_Link * CreateLink( int srcID, int destID, CAI_DynamicLink *pDynamicLink = NULL ); @@ -128,6 +130,8 @@ public: CAI_Node** AccessNodes() const { return m_pAInode; } + + private: friend class CAI_NetworkManager; diff --git a/tier1/strtools.cpp b/tier1/strtools.cpp index af81b059..7489654c 100644 --- a/tier1/strtools.cpp +++ b/tier1/strtools.cpp @@ -2019,6 +2019,9 @@ bool V_StripLastDir( char *dirName, int maxlen ) //----------------------------------------------------------------------------- const char * V_UnqualifiedFileName( const char * in ) { + if( !in || !in[0] ) + return in; + // back up until the character after the first path separator we find, // or the beginning of the string const char * out = in + strlen( in ) - 1;