diff options
author | Mattes D <github@xoft.cz> | 2014-12-06 16:08:08 +0100 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2014-12-06 16:08:08 +0100 |
commit | 3f23813412a201beb6697c02328570226b56116a (patch) | |
tree | 701080432028925707e6dce7149112ceb2b0f1a0 | |
parent | FinishGenPassiveMobs: Cosmetic changes. (diff) | |
parent | Fixes socket leak in HTTP server. (diff) | |
download | cuberite-3f23813412a201beb6697c02328570226b56116a.tar cuberite-3f23813412a201beb6697c02328570226b56116a.tar.gz cuberite-3f23813412a201beb6697c02328570226b56116a.tar.bz2 cuberite-3f23813412a201beb6697c02328570226b56116a.tar.lz cuberite-3f23813412a201beb6697c02328570226b56116a.tar.xz cuberite-3f23813412a201beb6697c02328570226b56116a.tar.zst cuberite-3f23813412a201beb6697c02328570226b56116a.zip |
Diffstat (limited to '')
-rw-r--r-- | src/OSSupport/SocketThreads.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/OSSupport/SocketThreads.cpp b/src/OSSupport/SocketThreads.cpp index 7a3ef4274..153d6ed1d 100644 --- a/src/OSSupport/SocketThreads.cpp +++ b/src/OSSupport/SocketThreads.cpp @@ -86,7 +86,8 @@ void cSocketThreads::RemoveClient(const cCallback * a_Client) } } // for itr - m_Threads[] - ASSERT(!"Removing an unknown client"); + // This client wasn't found. + // It's not an error, because it may have been removed by a different thread in the meantime. } @@ -491,10 +492,17 @@ void cSocketThreads::cSocketThread::ReadFromSockets(fd_set * a_Read) { case sSlot::ssNormal: { - // Notify the callback that the remote has closed the socket; keep the slot - m_Slots[i].m_Client->SocketClosed(); + // Close the socket on our side: m_Slots[i].m_State = sSlot::ssRemoteClosed; m_Slots[i].m_Socket.CloseSocket(); + + // Notify the callback that the remote has closed the socket, *after* removing the socket: + cCallback * client = m_Slots[i].m_Client; + m_Slots[i] = m_Slots[--m_NumSlots]; + if (client != nullptr) + { + client->SocketClosed(); + } break; } case sSlot::ssWritingRestOut: |