diff options
| author | Savander <savander.pl@gmail.com> | 2018-09-28 17:44:19 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-09-28 17:44:19 +0200 |
| commit | 012cda5afd013e27e529026b67722609ecd61d41 (patch) | |
| tree | a5c3789c4aa2c93255d824b5eb343172d3642eac /src/engine/shared/network.cpp | |
| parent | fc6d8b4d154049e6e3d6df9039669580f8ff747c (diff) | |
| parent | 2cd0223a8df54ae1c8715915a331dfc56a5a29d3 (diff) | |
| download | zcatch-012cda5afd013e27e529026b67722609ecd61d41.tar.gz zcatch-012cda5afd013e27e529026b67722609ecd61d41.zip | |
Merge pull request #4 from Learath2/zcatchspoof
Antispoof
Diffstat (limited to 'src/engine/shared/network.cpp')
| -rw-r--r-- | src/engine/shared/network.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/engine/shared/network.cpp b/src/engine/shared/network.cpp index ada4b18a..eb1a51dc 100644 --- a/src/engine/shared/network.cpp +++ b/src/engine/shared/network.cpp @@ -58,10 +58,13 @@ int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk) // handle sequence stuff if(m_pConnection && (Header.m_Flags&NET_CHUNKFLAG_VITAL)) { - if(Header.m_Sequence == (m_pConnection->m_Ack+1)%NET_MAX_SEQUENCE) + // anti spoof: ignore unknown sequence + if(Header.m_Sequence == (m_pConnection->m_Ack+1)%NET_MAX_SEQUENCE || m_pConnection->m_UnknownSeq) { + m_pConnection->m_UnknownSeq = false; + // in sequence - m_pConnection->m_Ack = (m_pConnection->m_Ack+1)%NET_MAX_SEQUENCE; + m_pConnection->m_Ack = Header.m_Sequence; } else { @@ -80,7 +83,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; @@ -101,7 +104,7 @@ void CNetBase::SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void * net_udp_send(Socket, pAddr, aBuffer, 6+DataSize); } -void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket) +void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket, SECURITY_TOKEN SecurityToken) { unsigned char aBuffer[NET_MAX_PACKETSIZE]; int CompressedSize = -1; @@ -117,6 +120,14 @@ void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct io_flush(ms_DataLogSent); } + if (SecurityToken != NET_SECURITY_TOKEN_UNSUPPORTED) + { + // append security token + // if SecurityToken is NET_SECURITY_TOKEN_UNKNOWN we will still append it hoping to negotiate it + mem_copy(&pPacket->m_aChunkData[pPacket->m_DataSize], &SecurityToken, sizeof(SecurityToken)); + pPacket->m_DataSize += sizeof(SecurityToken); + } + // compress CompressedSize = ms_Huffman.Compress(pPacket->m_aChunkData, pPacket->m_DataSize, &aBuffer[3], NET_MAX_PACKETSIZE-4); @@ -161,7 +172,8 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct // check the size if(Size < NET_PACKETHEADERSIZE || Size > NET_MAX_PACKETSIZE) { - dbg_msg("", "packet too small, %d", Size); + if(g_Config.m_Debug) + dbg_msg("", "packet too small, %d", Size); return -1; } @@ -185,7 +197,8 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct { if(Size < 6) { - dbg_msg("", "connection less packet too small, %d", Size); + if(g_Config.m_Debug) + dbg_msg("", "connection less packet too small, %d", Size); return -1; } @@ -198,7 +211,14 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct else { if(pPacket->m_Flags&NET_PACKETFLAG_COMPRESSION) + { + // Don't allow compressed control packets. + if(pPacket->m_Flags&NET_PACKETFLAG_CONTROL) + { + return -1; + } pPacket->m_DataSize = ms_Huffman.Decompress(&pBuffer[3], pPacket->m_DataSize, pPacket->m_aChunkData, sizeof(pPacket->m_aChunkData)); + } else mem_copy(pPacket->m_aChunkData, &pBuffer[3], pPacket->m_DataSize); } @@ -226,7 +246,7 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct } -void CNetBase::SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize) +void CNetBase::SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize, SECURITY_TOKEN SecurityToken) { CNetPacketConstruct Construct; Construct.m_Flags = NET_PACKETFLAG_CONTROL; @@ -237,7 +257,7 @@ void CNetBase::SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int Con mem_copy(&Construct.m_aChunkData[1], pExtra, ExtraSize); // send the control message - CNetBase::SendPacket(Socket, pAddr, &Construct); + CNetBase::SendPacket(Socket, pAddr, &Construct, SecurityToken); } |