From c334824199fcddde9f5a712a08a54db798965890 Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Fri, 8 Sep 2017 08:36:23 +0100 Subject: Shutdown connection when disconnect packet sent (#3999) --- src/ClientHandle.cpp | 14 ++++++++++---- src/ClientHandle.h | 8 +------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ClientHandle.cpp b/src/ClientHandle.cpp index 878f84782..f42f52cb1 100644 --- a/src/ClientHandle.cpp +++ b/src/ClientHandle.cpp @@ -2087,6 +2087,12 @@ void cClientHandle::Tick(float a_Dt) return; } + // If player has been kicked, terminate the connection: + if (m_State == csKicked) + { + m_Link->Shutdown(); + } + // If destruction is queued, destroy now: if (m_State == csQueuedForDestruction) { @@ -2515,6 +2521,10 @@ void cClientHandle::SendDisconnect(const AString & a_Reason) LOGD("Sending a DC: \"%s\"", StripColorCodes(a_Reason).c_str()); m_Protocol->SendDisconnect(a_Reason); m_HasSentDC = true; + // csKicked means m_Link will be shut down on the next tick. The + // disconnect packet data is sent in the tick thread so the connection + // is closed there after the data is sent. + m_State = csKicked; } } @@ -3389,7 +3399,3 @@ void cClientHandle::OnError(int a_ErrorCode, const AString & a_ErrorMsg) } SocketClosed(); } - - - - diff --git a/src/ClientHandle.h b/src/ClientHandle.h index b1acede77..630994c2e 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -491,11 +491,10 @@ private: csDownloadingWorld, ///< The client is waiting for chunks, we're waiting for the loader to provide and send them csConfirmingPos, ///< The client has been sent the position packet, waiting for them to repeat the position back csPlaying, ///< Normal gameplay + csKicked, ///< Disconnect packet sent, awaiting connection closure csQueuedForDestruction, ///< The client will be destroyed in the next tick (flag set when socket closed) csDestroying, ///< The client is being destroyed, don't queue any more packets / don't add to chunks csDestroyed, ///< The client has been destroyed, the destructor is to be called from the owner thread - - // TODO: Add Kicking here as well } ; /* Mutex protecting m_State from concurrent writes. */ @@ -595,8 +594,3 @@ private: virtual void OnRemoteClosed(void) override; virtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override; }; // tolua_export - - - - - -- cgit v1.2.3