From 092bd4d536595e020006d4e843a2ec31a4d9dcee Mon Sep 17 00:00:00 2001 From: lidgren Date: Sun, 10 Aug 2014 18:46:26 +0000 Subject: [PATCH] Fix for possible race condition resulting in duplicate message recycling Fix for DoS vulnerability with incoming acks --- Lidgren.Network/NetConnection.cs | 5 ++++- Lidgren.Network/NetReliableSenderChannel.cs | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs index e314b70..d634671 100644 --- a/Lidgren.Network/NetConnection.cs +++ b/Lidgren.Network/NetConnection.cs @@ -234,8 +234,11 @@ namespace Lidgren.Network { //m_peer.LogVerbose("Received ack for " + acktp + "#" + seqNr); NetSenderChannelBase chan = m_sendChannels[(int)incAck.Item1 - 1]; + + // If we haven't sent a message on this channel there is no reason to ack it if (chan == null) - chan = CreateSenderChannel(incAck.Item1); + continue; + chan.ReceiveAcknowledge(now, incAck.Item2); } } diff --git a/Lidgren.Network/NetReliableSenderChannel.cs b/Lidgren.Network/NetReliableSenderChannel.cs index ade2e9d..7fe4d6c 100644 --- a/Lidgren.Network/NetReliableSenderChannel.cs +++ b/Lidgren.Network/NetReliableSenderChannel.cs @@ -138,8 +138,7 @@ namespace Lidgren.Network if (storedMessage != null) { #endif - Interlocked.Decrement(ref storedMessage.m_recyclingCount); - if (storedMessage.m_recyclingCount <= 0) + if (Interlocked.Decrement(ref storedMessage.m_recyclingCount) <= 0) m_connection.m_peer.Recycle(storedMessage); #if !DEBUG