From 3f3abebebf20e8901376b929e2afcc6bdb404a3b Mon Sep 17 00:00:00 2001 From: oy Date: Thu, 19 Mar 2015 09:57:47 +0100 Subject: force vital check on essential cl/srv messages and added additional sequence checking --- src/engine/shared/network.cpp | 2 +- src/engine/shared/network.h | 1 + src/engine/shared/network_conn.cpp | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src/engine/shared') diff --git a/src/engine/shared/network.cpp b/src/engine/shared/network.cpp index ada4b18a..13d62077 100644 --- a/src/engine/shared/network.cpp +++ b/src/engine/shared/network.cpp @@ -80,7 +80,7 @@ int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk) // fill in the info pChunk->m_ClientID = m_ClientID; pChunk->m_Address = m_Addr; - pChunk->m_Flags = 0; + pChunk->m_Flags = Header.m_Flags; pChunk->m_DataSize = Header.m_Size; pChunk->m_pData = pData; return 1; diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h index 259d600f..cbc6e560 100644 --- a/src/engine/shared/network.h +++ b/src/engine/shared/network.h @@ -136,6 +136,7 @@ class CNetConnection private: unsigned short m_Sequence; unsigned short m_Ack; + unsigned short m_PeerAck; unsigned m_State; int m_Token; diff --git a/src/engine/shared/network_conn.cpp b/src/engine/shared/network_conn.cpp index cd2df048..7d76d585 100644 --- a/src/engine/shared/network_conn.cpp +++ b/src/engine/shared/network_conn.cpp @@ -13,6 +13,7 @@ void CNetConnection::Reset() { m_Sequence = 0; m_Ack = 0; + m_PeerAck = 0; m_RemoteClosed = 0; m_State = NET_CONNSTATE_OFFLINE; @@ -196,6 +197,19 @@ void CNetConnection::Disconnect(const char *pReason) int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr) { + // check if actual ack value is valid(own sequence..latest peer ack) + if(m_Sequence >= m_PeerAck) + { + if(pPacket->m_Ack < m_PeerAck || pPacket->m_Ack > m_Sequence) + return 0; + } + else + { + if(pPacket->m_Ack < m_PeerAck && pPacket->m_Ack > m_Sequence) + return 0; + } + m_PeerAck = pPacket->m_Ack; + int64 Now = time_get(); // check if resend is requested -- cgit 1.4.1