From 1bc19e788c79619180834f6af3f267dce9e5d7ba Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Sun, 11 Oct 2020 20:27:52 +0200 Subject: [PATCH] Drop and log sync orders with mismatching length --- OpenRA.Game/Network/GameSave.cs | 8 +++++++- OpenRA.Game/Network/OrderManager.cs | 10 +++++++++- OpenRA.Game/Server/Server.cs | 9 +++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/OpenRA.Game/Network/GameSave.cs b/OpenRA.Game/Network/GameSave.cs index e53e502ceb..d823db8873 100644 --- a/OpenRA.Game/Network/GameSave.cs +++ b/OpenRA.Game/Network/GameSave.cs @@ -188,8 +188,14 @@ namespace OpenRA.Network public void DispatchOrders(Connection conn, int frame, byte[] data) { // Sync packet - we only care about the last value - if (data.Length == Order.SyncHashOrderLength && data[0] == (byte)OrderType.SyncHash && frame > LastSyncFrame) + if (data.Length > 0 && data[0] == (byte)OrderType.SyncHash && frame > LastSyncFrame) { + if (data.Length != Order.SyncHashOrderLength) + { + Log.Write("debug", "Dropped sync order with length {0}. Expected length {1}.".F(data.Length, Order.SyncHashOrderLength)); + return; + } + LastSyncFrame = frame; lastSyncPacket = data; } diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index 77d2976bc6..e0fe3392b6 100644 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -123,8 +123,16 @@ namespace OpenRA.Network var frame = BitConverter.ToInt32(packet, 0); if (packet.Length == 5 && packet[4] == (byte)OrderType.Disconnect) frameData.ClientQuit(clientId, frame); - else if (packet.Length == 4 + Order.SyncHashOrderLength && packet[4] == (byte)OrderType.SyncHash) + else if (packet.Length > 4 && packet[4] == (byte)OrderType.SyncHash) + { + if (packet.Length != 4 + Order.SyncHashOrderLength) + { + Log.Write("debug", "Dropped sync order with length {0}. Expected length {1}.".F(packet.Length, 4 + Order.SyncHashOrderLength)); + return; + } + CheckSync(packet); + } else if (frame == 0) immediatePackets.Add((clientId, packet)); else diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 3a87d9fdeb..89a99091a0 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -784,8 +784,13 @@ namespace OpenRA.Server { recorder.ReceiveFrame(from, frame, data); - if (data.Length == Order.SyncHashOrderLength && data[0] == (byte)OrderType.SyncHash) - HandleSyncOrder(frame, data); + if (data.Length > 0 && data[0] == (byte)OrderType.SyncHash) + { + if (data.Length == Order.SyncHashOrderLength) + HandleSyncOrder(frame, data); + else + Log.Write("server", "Dropped sync order with length {0} from client {1}. Expected length {2}.".F(data.Length, from, Order.SyncHashOrderLength)); + } } }