Drop and log sync orders with mismatching length

This commit is contained in:
abcdefg30
2020-10-11 20:27:52 +02:00
committed by abcdefg30
parent c17110dac5
commit 1bc19e788c
3 changed files with 23 additions and 4 deletions

View File

@@ -188,8 +188,14 @@ namespace OpenRA.Network
public void DispatchOrders(Connection conn, int frame, byte[] data) public void DispatchOrders(Connection conn, int frame, byte[] data)
{ {
// Sync packet - we only care about the last value // 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; LastSyncFrame = frame;
lastSyncPacket = data; lastSyncPacket = data;
} }

View File

@@ -123,8 +123,16 @@ namespace OpenRA.Network
var frame = BitConverter.ToInt32(packet, 0); var frame = BitConverter.ToInt32(packet, 0);
if (packet.Length == 5 && packet[4] == (byte)OrderType.Disconnect) if (packet.Length == 5 && packet[4] == (byte)OrderType.Disconnect)
frameData.ClientQuit(clientId, frame); 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); CheckSync(packet);
}
else if (frame == 0) else if (frame == 0)
immediatePackets.Add((clientId, packet)); immediatePackets.Add((clientId, packet));
else else

View File

@@ -784,8 +784,13 @@ namespace OpenRA.Server
{ {
recorder.ReceiveFrame(from, frame, data); recorder.ReceiveFrame(from, frame, data);
if (data.Length == Order.SyncHashOrderLength && data[0] == (byte)OrderType.SyncHash) if (data.Length > 0 && data[0] == (byte)OrderType.SyncHash)
{
if (data.Length == Order.SyncHashOrderLength)
HandleSyncOrder(frame, data); 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));
}
} }
} }