From 66e2e13ba19145ef4ad85e4a5817c35056bfab7c Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Tue, 7 May 2024 08:34:47 +0000 Subject: [PATCH] Add few more safety checks to network connection logic --- lib/network/NetworkConnection.cpp | 8 ++++++-- lib/network/NetworkConnection.h | 1 + lib/networkPacks/NetPacksBase.h | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/network/NetworkConnection.cpp b/lib/network/NetworkConnection.cpp index b28daadad..a034fdd7b 100644 --- a/lib/network/NetworkConnection.cpp +++ b/lib/network/NetworkConnection.cpp @@ -71,7 +71,8 @@ void NetworkConnection::onHeaderReceived(const boost::system::error_code & ecHea if (messageSize == 0) { - listener.onDisconnected(shared_from_this(), "Zero-sized packet!"); + // Zero-sized packet. Strange, but safe to ignore. Start reading next packet + start(); return; } @@ -103,13 +104,16 @@ void NetworkConnection::onPacketReceived(const boost::system::error_code & ec, u void NetworkConnection::sendPacket(const std::vector & message) { + std::lock_guard lock(writeMutex); + boost::system::error_code ec; // create array with single element - boost::asio::buffer can be constructed from containers, but not from plain integer std::array messageSize{static_cast(message.size())}; boost::asio::write(*socket, boost::asio::buffer(messageSize), ec ); - boost::asio::write(*socket, boost::asio::buffer(message), ec ); + if (message.size() > 0) + boost::asio::write(*socket, boost::asio::buffer(message), ec ); //Note: ignoring error code, intended } diff --git a/lib/network/NetworkConnection.h b/lib/network/NetworkConnection.h index beaaba376..8ffafe1b3 100644 --- a/lib/network/NetworkConnection.h +++ b/lib/network/NetworkConnection.h @@ -19,6 +19,7 @@ class NetworkConnection : public INetworkConnection, public std::enable_shared_f static const int messageMaxSize = 64 * 1024 * 1024; // arbitrary size to prevent potential massive allocation if we receive garbage input std::shared_ptr socket; + std::mutex writeMutex; NetworkBuffer readBuffer; INetworkConnectionListener & listener; diff --git a/lib/networkPacks/NetPacksBase.h b/lib/networkPacks/NetPacksBase.h index c158a2953..093cc2cb1 100644 --- a/lib/networkPacks/NetPacksBase.h +++ b/lib/networkPacks/NetPacksBase.h @@ -30,7 +30,7 @@ struct DLL_LINKAGE CPack template void serialize(Handler &h) { logNetwork->error("CPack serialized... this should not happen!"); - assert(false && "CPack serialized"); + throw std::runtime_error("CPack serialized... this should not happen!"); } void applyGs(CGameState * gs)