From 5d09867066c5b6a602f70b7e3c1d9ddcee063689 Mon Sep 17 00:00:00 2001 From: agatho Date: Tue, 3 Feb 2026 12:59:52 +0100 Subject: [PATCH] fix(map): Add safety checks to prevent null map crash in AddUpdateObject Added null pointer validation to: - WorldObject::AddToObjectUpdate() - validates GetMap() before calling - WorldObject::RemoveFromObjectUpdate() - same validation - Map::AddUpdateObject() - validates object pointer - Map::RemoveUpdateObject() - same validation These checks prevent potential crashes from memory corruption scenarios where the Map pointer or object pointer could be invalid. Co-Authored-By: Claude Opus 4.5 Signed-off-by: luis --- src/server/game/Entities/Object/Object.cpp | 18 ++++++++++++++++-- src/server/game/Maps/Map.h | 7 +++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 0e3039bc2..edfe50b15 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -3113,13 +3113,27 @@ void WorldObject::BuildUpdate(UpdateDataMapType& data_map) bool WorldObject::AddToObjectUpdate() { - GetMap()->AddUpdateObject(this); + // SAFETY CHECK: Validate Map pointer to prevent crash in AddUpdateObject + // Crash at Map.h:573 (hash set insert) could be caused by corrupted Map pointer + Map* map = GetMap(); + if (!map) + { + TC_LOG_ERROR("misc", "WorldObject::AddToObjectUpdate called with null map for {}", GetGUID().ToString()); + return false; + } + map->AddUpdateObject(this); return true; } void WorldObject::RemoveFromObjectUpdate() { - GetMap()->RemoveUpdateObject(this); + Map* map = GetMap(); + if (!map) + { + TC_LOG_ERROR("misc", "WorldObject::RemoveFromObjectUpdate called with null map for {}", GetGUID().ToString()); + return; + } + map->RemoveUpdateObject(this); } ObjectGuid WorldObject::GetTransGUID() const diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 15793ba51..c5d7b3ca8 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -570,12 +570,15 @@ class TC_GAME_API Map : public GridRefManager void AddUpdateObject(BaseEntity* obj) { - _updateObjects.insert(obj); + // Null check only - BaseEntity is forward declared, can't call methods here + if (obj) + _updateObjects.insert(obj); } void RemoveUpdateObject(BaseEntity* obj) { - _updateObjects.erase(obj); + if (obj) + _updateObjects.erase(obj); } size_t GetActiveNonPlayersCount() const