diff options
author | DDuarte <dnpd.dd@gmail.com> | 2014-07-25 18:01:27 +0100 |
---|---|---|
committer | DDuarte <dnpd.dd@gmail.com> | 2014-07-25 18:06:43 +0100 |
commit | 4f1d247dfba124c628feaa24c603cd5cc24f0349 (patch) | |
tree | cef8e772dee6871fec13343bb4a3a43d14d02796 | |
parent | cbcebbe63d794203ccce6ec06c39c5f2a0d2a6de (diff) |
Core/Network: Fix some possible exceptions on socket.close()
Ref #12634
-rw-r--r-- | src/server/authserver/Server/AuthSession.cpp | 16 | ||||
-rw-r--r-- | src/server/authserver/Server/AuthSession.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.h | 4 |
4 files changed, 30 insertions, 13 deletions
diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp index 9bd9313059a..cad82a80a07 100644 --- a/src/server/authserver/Server/AuthSession.cpp +++ b/src/server/authserver/Server/AuthSession.cpp @@ -161,7 +161,7 @@ void AuthSession::AsyncReadHeader() } else { - _socket.close(); + CloseSocket(); } }); } @@ -176,7 +176,7 @@ void AuthSession::AsyncReadData(bool (AuthSession::*handler)(), size_t dataSize, { if (!(*this.*handler)()) { - _socket.close(); + CloseSocket(); return; } @@ -184,7 +184,7 @@ void AuthSession::AsyncReadData(bool (AuthSession::*handler)(), size_t dataSize, } else { - _socket.close(); + CloseSocket(); } }); } @@ -195,7 +195,7 @@ void AuthSession::AsyncWrite(std::size_t length) { if (error) { - _socket.close(); + CloseSocket(); } }); } @@ -935,3 +935,11 @@ void AuthSession::SetVSFields(const std::string& rI) OPENSSL_free(v_hex); OPENSSL_free(s_hex); } + +void AuthSession::CloseSocket() +{ + boost::system::error_code socketError; + _socket.close(socketError); + if (socketError) + TC_LOG_DEBUG("server.authserver", "Account '%s' errored when closing socket: %i (%s)", _login.c_str(), socketError.value(), socketError.message()); +} diff --git a/src/server/authserver/Server/AuthSession.h b/src/server/authserver/Server/AuthSession.h index 4ae33f44cb3..6dc9c404857 100644 --- a/src/server/authserver/Server/AuthSession.h +++ b/src/server/authserver/Server/AuthSession.h @@ -58,6 +58,7 @@ private: void AsyncReadData(bool (AuthSession::*handler)(), size_t dataSize, size_t bufferOffset); void AsyncWrite(size_t length); + void CloseSocket(); void SetVSFields(const std::string& rI); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 6ef986dbd22..682ea320365 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -78,8 +78,7 @@ void WorldSocket::AsyncReadHeader() else { // _socket.is_open() till returns true even after calling close() - boost::system::error_code socketError; - _socket.close(socketError); + CloseSocket(); } }); } @@ -155,8 +154,7 @@ void WorldSocket::AsyncReadData(size_t dataSize) else { // _socket.is_open() till returns true even after calling close() - boost::system::error_code socketError; - _socket.close(socketError); + CloseSocket(); } }); } @@ -202,7 +200,7 @@ void WorldSocket::AsyncWrite(std::vector<uint8> const& data) AsyncWrite(_writeQueue.front()); } else - _socket.close(); + CloseSocket(); }); } @@ -475,7 +473,7 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket) TC_LOG_ERROR("network", "WorldSocket::HandlePing: %s kicked for over-speed pings (address: %s)", _worldSession->GetPlayerInfo().c_str(), GetRemoteIpAddress().c_str()); - _socket.close(); + CloseSocket(); return; } } @@ -494,7 +492,7 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket) TC_LOG_ERROR("network", "WorldSocket::HandlePing: peer sent CMSG_PING, but is not authenticated or got recently kicked, address = %s", GetRemoteIpAddress().c_str()); - _socket.close(); + CloseSocket(); return; } @@ -502,3 +500,13 @@ void WorldSocket::HandlePing(WorldPacket& recvPacket) packet << ping; return AsyncWrite(packet); } + +void WorldSocket::CloseSocket() +{ + boost::system::error_code socketError; + _socket.close(socketError); + if (socketError) + TC_LOG_DEBUG("network", "WorldSocket::CloseSocket: Player '%s' (%s) errored when closing socket: %i (%s)", + _worldSession ? _worldSession->GetPlayerInfo().c_str() : "unknown", GetRemoteIpAddress().c_str(), + socketError.value(), socketError.message()); +} diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 07aae10513f..0f3fc553872 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -55,8 +55,8 @@ public: std::string GetRemoteIpAddress() const { return _socket.remote_endpoint().address().to_string(); }; uint16 GetRemotePort() const { return _socket.remote_endpoint().port(); } - void CloseSocket() { _socket.close(); }; - bool IsOpen() { return _socket.is_open(); }; + void CloseSocket(); + bool IsOpen() const { return _socket.is_open(); } void AsyncWrite(WorldPacket const& packet); |