From 81e44711a24105b22aedde10628be9008ac5e1f0 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Mon, 19 Feb 2024 13:45:50 +0200 Subject: [PATCH 1/3] Remove no longer needed workaround --- lib/CConsoleHandler.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/CConsoleHandler.cpp b/lib/CConsoleHandler.cpp index 72de08baa..a0eca4814 100644 --- a/lib/CConsoleHandler.cpp +++ b/lib/CConsoleHandler.cpp @@ -143,13 +143,6 @@ LONG WINAPI onUnhandledException(EXCEPTION_POINTERS* exception) HANDLE dfile = CreateFileA(mname, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); logGlobal->error("Crash info will be put in %s", mname); - // flush loggers - std::string padding(1000, '@'); - - logGlobal->error(padding); - logAi->error(padding); - logNetwork->error(padding); - auto dumpType = MiniDumpWithDataSegs; if(settings["general"]["extraDump"].Bool()) From f620a073890dad19ab99247e37af099aa2f966f4 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Mon, 19 Feb 2024 13:46:07 +0200 Subject: [PATCH 2/3] Add protocol validation --- lib/network/NetworkConnection.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/network/NetworkConnection.cpp b/lib/network/NetworkConnection.cpp index 01e20d951..7b31ca04b 100644 --- a/lib/network/NetworkConnection.cpp +++ b/lib/network/NetworkConnection.cpp @@ -49,6 +49,12 @@ void NetworkConnection::onHeaderReceived(const boost::system::error_code & ecHea return; } + if (messageSize == 0) + { + listener.onDisconnected(shared_from_this(), "Zero-sized packet!"); + return; + } + boost::asio::async_read(*socket, readBuffer, boost::asio::transfer_exactly(messageSize), From 779625415f33388160ae5aa928fb3508fc13d815 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Mon, 19 Feb 2024 13:47:06 +0200 Subject: [PATCH 3/3] Guard against concurrent writes on same asio::socket instance --- lib/network/NetworkConnection.cpp | 1 + lib/network/NetworkConnection.h | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/network/NetworkConnection.cpp b/lib/network/NetworkConnection.cpp index 7b31ca04b..e2239d8bd 100644 --- a/lib/network/NetworkConnection.cpp +++ b/lib/network/NetworkConnection.cpp @@ -88,6 +88,7 @@ void NetworkConnection::sendPacket(const std::vector & message) // 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::mutex::scoped_lock lock(writeMutex); boost::asio::write(*socket, boost::asio::buffer(messageSize), ec ); boost::asio::write(*socket, boost::asio::buffer(message), ec ); diff --git a/lib/network/NetworkConnection.h b/lib/network/NetworkConnection.h index beaaba376..a6d3b721d 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; + boost::mutex writeMutex; NetworkBuffer readBuffer; INetworkConnectionListener & listener;