From e08331a24b1c6bb2994c8dabfe5911e72c14f974 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Sun, 7 Dec 2014 16:14:27 +0100 Subject: Fixed crash on server stop. The entity destructors called through chunkmap destructor and chunk destructor were accessing the world which was in an already invalid state (half-destroyed). Fixed by destroying chunkmap explicitly and providing a nullptr check in the HasEntity() function. --- src/World.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/World.cpp b/src/World.cpp index 91e1199ee..e73dcb915 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -346,6 +346,10 @@ cWorld::~cWorld() Serializer.Save(); m_MapManager.SaveMapData(); + + // Explicitly destroy the chunkmap, so that it's guaranteed to be destroyed before the other internals + // This fixes crashes on stopping the server, because chunk destructor deletes entities and those access the world. + m_ChunkMap.reset(); } @@ -3122,6 +3126,11 @@ bool cWorld::HasEntity(int a_UniqueID) } // Check if the entity is in the chunkmap: + if (m_ChunkMap.get() == nullptr) + { + // Chunkmap has already been destroyed, there are no entities anymore. + return false; + } return m_ChunkMap->HasEntity(a_UniqueID); } -- cgit v1.2.3