From 4f54aa5c42a6614427e62ab116a74138fa2996ea Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Thu, 29 Jul 2021 02:26:02 +0300 Subject: [PATCH] Limit the count of packets processed per update --- src/openrct2/network/NetworkBase.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 4bce56d75e..84ac7ae653 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -49,6 +49,9 @@ static int32_t _pickup_peep_old_x = LOCATION_NULL; // with uint16_t and needs some spare room for other data in the packet. static constexpr uint32_t CHUNK_SIZE = 1024 * 63; +// If data is sent fast enough it would halt the entire server, process only a maximum amount. +static constexpr uint32_t MaxPacketsPerUpdate = 100; + # include "../Cheats.h" # include "../ParkImporter.h" # include "../Version.h" @@ -1654,8 +1657,11 @@ void NetworkBase::Server_Send_EVENT_PLAYER_DISCONNECTED(const char* playerName, bool NetworkBase::ProcessConnection(NetworkConnection& connection) { NetworkReadPacket packetStatus; + + uint32_t countProcessed = 0; do { + countProcessed++; packetStatus = connection.ReadPacket(); switch (packetStatus) { @@ -1681,7 +1687,7 @@ bool NetworkBase::ProcessConnection(NetworkConnection& connection) // could not read anything from socket break; } - } while (packetStatus == NetworkReadPacket::Success); + } while (packetStatus == NetworkReadPacket::Success && countProcessed < MaxPacketsPerUpdate); if (!connection.ReceivedPacketRecently()) {