From 3abb1ce00588f1aeff85de4f95ed48f2d4aeaf23 Mon Sep 17 00:00:00 2001 From: ferib Date: Wed, 8 Jan 2025 05:18:43 +0100 Subject: [PATCH] fix race condition on PacketsToBeHandled --- TNL.NET/Network/TNLSocket.cs | 4 +++- TNL.NET/Utils/PacketStream.cs | 14 +++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/TNL.NET/Network/TNLSocket.cs b/TNL.NET/Network/TNLSocket.cs index 759a597..e00cdf7 100644 --- a/TNL.NET/Network/TNLSocket.cs +++ b/TNL.NET/Network/TNLSocket.cs @@ -18,6 +18,7 @@ public class TNLSocket private bool _needRun; private readonly UdpClient _socket; + public object _lock = new object(); public Queue> PacketsToBeHandled = new(); public TNLSocket() @@ -42,7 +43,8 @@ private void OnEndReceive(IAsyncResult result) var buff = _socket.EndReceive(result, ref ep); if (buff != null && buff.Length > 0) - PacketsToBeHandled.Enqueue(new(ep, buff)); + lock(_lock) + PacketsToBeHandled.Enqueue(new(ep, buff)); } catch (ObjectDisposedException) { diff --git a/TNL.NET/Utils/PacketStream.cs b/TNL.NET/Utils/PacketStream.cs index 28f5906..65b8311 100644 --- a/TNL.NET/Utils/PacketStream.cs +++ b/TNL.NET/Utils/PacketStream.cs @@ -26,14 +26,18 @@ public NetError SendTo(TNLSocket outgoingSocket, IPEndPoint theAddress) public NetError RecvFrom(TNLSocket incomingSocket, out IPEndPoint recvAddress) { - if (incomingSocket.PacketsToBeHandled.Count == 0) + Tuple d; + + lock (incomingSocket._lock) { - recvAddress = null; - return NetError.WouldBlock; + if (incomingSocket.PacketsToBeHandled.Count == 0) + { + recvAddress = null; + return NetError.WouldBlock; + } + d = incomingSocket.PacketsToBeHandled.Dequeue(); } - var d = incomingSocket.PacketsToBeHandled.Dequeue(); - var dataSize = d.Item2.Length > TNLSocket.MaxPacketDataSize ? TNLSocket.MaxPacketDataSize : (uint) d.Item2.Length; Array.Copy(d.Item2, _buffer, dataSize);