Skip to content

Commit f3e5ca7

Browse files
authored
FIX CRC32Layer should drop packets with bad checksum (#414)
* FIX CRC32Layer should drop packets with bad checksum
1 parent c78e167 commit f3e5ca7

File tree

3 files changed

+97
-1
lines changed

3 files changed

+97
-1
lines changed

LiteNetLib.Tests/CRC32LayerTest.cs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using LiteNetLib.Layers;
2+
using LiteNetLib.Utils;
3+
using NUnit.Framework;
4+
using System;
5+
using System.Net;
6+
7+
namespace LiteNetLib.Tests
8+
{
9+
[TestFixture]
10+
public class CRC32LayerTest
11+
{
12+
private Crc32cLayer _crc32Layer;
13+
private IPEndPoint _dummyEndpoint;
14+
15+
[SetUp]
16+
public void Setup()
17+
{
18+
NetDebug.Logger = null;
19+
_crc32Layer = new Crc32cLayer();
20+
_dummyEndpoint = new IPEndPoint(IPAddress.Loopback, 23456);
21+
}
22+
23+
[Test]
24+
public void ReturnsDataWithoutChecksum()
25+
{
26+
byte[] packet = GetTestPacketWithCrc();
27+
28+
int offset = 0;
29+
int length = packet.Length;
30+
_crc32Layer.ProcessInboundPacket(_dummyEndpoint, ref packet, ref offset, ref length);
31+
32+
Assert.AreEqual(packet.Length - CRC32C.ChecksumSize, length);
33+
}
34+
35+
[Test]
36+
public void ReturnsNilCountForBadChecksum()
37+
{
38+
byte[] packet = GetTestPacketWithCrc();
39+
40+
//Fake a change to the data to cause data/crc missmatch
41+
packet[4] = 0;
42+
43+
int offset = 0;
44+
int length = packet.Length;
45+
_crc32Layer.ProcessInboundPacket(_dummyEndpoint, ref packet, ref offset, ref length);
46+
47+
Assert.AreEqual(0, length);
48+
}
49+
50+
[Test]
51+
public void ReturnsNilCountForTooShortMessage()
52+
{
53+
byte[] packet = new byte[2];
54+
55+
int offset = 0;
56+
int length = packet.Length;
57+
58+
_crc32Layer.ProcessInboundPacket(_dummyEndpoint, ref packet, ref offset, ref length);
59+
60+
Assert.AreEqual(0, length);
61+
}
62+
63+
[Test]
64+
public void CanSendAndReceiveSameMessage()
65+
{
66+
byte[] message = GetTestMessageBytes();
67+
//Process outbound adds bytes, so we need a larger array
68+
byte[] package = new byte[message.Length + CRC32C.ChecksumSize];
69+
70+
Buffer.BlockCopy(message, 0, package, 0, message.Length);
71+
72+
int offset = 0;
73+
int length = message.Length;
74+
_crc32Layer.ProcessOutBoundPacket(_dummyEndpoint, ref package, ref offset, ref length);
75+
_crc32Layer.ProcessInboundPacket(_dummyEndpoint, ref package, ref offset, ref length);
76+
}
77+
78+
private static byte[] GetTestPacketWithCrc()
79+
{
80+
byte[] testMsg = GetTestMessageBytes();
81+
uint crc32 = CRC32C.Compute(testMsg, 0, testMsg.Length);
82+
83+
byte[] packet = new byte[testMsg.Length + CRC32C.ChecksumSize];
84+
Buffer.BlockCopy(testMsg, 0, packet, 0, testMsg.Length);
85+
FastBitConverter.GetBytes(packet, testMsg.Length, crc32);
86+
return packet;
87+
}
88+
89+
private static byte[] GetTestMessageBytes()
90+
=> System.Text.Encoding.ASCII.GetBytes("This is a test string with some length");
91+
}
92+
}

LiteNetLib.Tests/CommunicationTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ public void HelperManagerStackTest()
662662
public void ManualMode()
663663
{
664664
var serverListener = new EventBasedNetListener();
665-
var server = new NetManager(serverListener);
665+
var server = new NetManager(serverListener, new Crc32cLayer());
666666

667667
serverListener.ConnectionRequestEvent += request => request.AcceptIfKey(DefaultAppKey);
668668

LiteNetLib/Layers/Crc32cLayer.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@ public override void ProcessInboundPacket(IPEndPoint endPoint, ref byte[] data,
1616
if (length < NetConstants.HeaderSize + CRC32C.ChecksumSize)
1717
{
1818
NetDebug.WriteError("[NM] DataReceived size: bad!");
19+
//Set length to 0 to have netManager drop the packet.
20+
length = 0;
1921
return;
2022
}
2123

2224
int checksumPoint = length - CRC32C.ChecksumSize;
2325
if (CRC32C.Compute(data, offset, checksumPoint) != BitConverter.ToUInt32(data, checksumPoint))
2426
{
2527
NetDebug.Write("[NM] DataReceived checksum: bad!");
28+
//Set length to 0 to have netManager drop the packet.
29+
length = 0;
2630
return;
2731
}
2832
length -= CRC32C.ChecksumSize;

0 commit comments

Comments
 (0)