From 9eb765e85a1d47f075d2434a1a9fe2692815a44f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 24 Mar 2019 22:12:36 +1100 Subject: [PATCH] add malformed packet check back in and handle lobby connections better --- src/lobby/GameConnection.cpp | 19 ++++++------------- src/lobby/GameConnection.h | 1 + src/world/Network/GameConnection.cpp | 20 +++++++++++++++++--- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/lobby/GameConnection.cpp b/src/lobby/GameConnection.cpp index 8d6d479a..4f162d45 100644 --- a/src/lobby/GameConnection.cpp +++ b/src/lobby/GameConnection.cpp @@ -54,16 +54,13 @@ void Sapphire::Network::GameConnection::onDisconnect() void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer ) { - Packets::FFXIVARR_PACKET_HEADER packetHeader; - const auto headerResult = Packets::getHeader( buffer, 0, packetHeader ); + m_packets.insert( std::end( m_packets ), std::begin( buffer ), std::end( buffer ) ); + // This is assumed packet always start with valid FFXIVARR_PACKET_HEADER for now. + Packets::FFXIVARR_PACKET_HEADER packetHeader{}; + const auto headerResult = Packets::getHeader( m_packets, 0, packetHeader ); if( headerResult == Incomplete ) - { - Logger::info( "Dropping connection due to incomplete packet header." ); - Logger::info( "FIXME: Packet message bounary is not implemented." ); - disconnect(); return; - } if( headerResult == Malformed ) { @@ -74,16 +71,11 @@ void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer ) // Dissect packet list std::vector< Packets::FFXIVARR_PACKET_RAW > packetList; - const auto packetResult = Packets::getPackets( buffer, sizeof( struct FFXIVARR_PACKET_HEADER ), + const auto packetResult = Packets::getPackets( m_packets, sizeof( struct FFXIVARR_PACKET_HEADER ), packetHeader, packetList ); if( packetResult == Incomplete ) - { - Logger::info( "Dropping connection due to incomplete packets." ); - Logger::info( "FIXME: Packet message bounary is not implemented." ); - disconnect(); return; - } if( packetResult == Malformed ) { @@ -94,6 +86,7 @@ void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer ) // Handle it handlePackets( packetHeader, packetList ); + m_packets.clear(); } diff --git a/src/lobby/GameConnection.h b/src/lobby/GameConnection.h index fc37756c..6bcb7122 100644 --- a/src/lobby/GameConnection.h +++ b/src/lobby/GameConnection.h @@ -38,6 +38,7 @@ namespace Sapphire::Network LockedQueue< Packets::GamePacketPtr > m_inQueue; LockedQueue< Packets::GamePacketPtr > m_outQueue; + std::vector< uint8_t > m_packets; public: GameConnection( HivePtr pHive, AcceptorPtr pAcceptor, FrameworkPtr pFw ); diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 2559793d..103051f5 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -154,22 +154,36 @@ void Sapphire::Network::GameConnection::onDisconnect() void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer ) { - m_packets.insert( std::end( m_packets ), std::begin( buffer ), std::end( buffer ) ); + m_packets.insert( std::end( m_packets ), std::begin( buffer ), std::end( buffer ) ); // This is assumed packet always start with valid FFXIVARR_PACKET_HEADER for now. Packets::FFXIVARR_PACKET_HEADER packetHeader{}; const auto headerResult = Packets::getHeader( m_packets, 0, packetHeader ); - if( ( headerResult == Incomplete ) || ( headerResult == Malformed ) ) + if( headerResult == Incomplete ) return; + if( headerResult == Malformed ) + { + Logger::info( "Dropping connection due to malformed packet header." ); + disconnect(); + return; + } + // Dissect packet list std::vector< Packets::FFXIVARR_PACKET_RAW > packetList; const auto packetResult = Packets::getPackets( m_packets, sizeof( struct FFXIVARR_PACKET_HEADER ), packetHeader, packetList ); - if( ( packetResult == Incomplete ) || ( packetResult == Malformed ) ) + if( packetResult == Incomplete ) return; + if( packetResult == Malformed ) + { + Logger::info( "Dropping connection due to malformed packets." ); + disconnect(); + return; + } + // Handle it handlePackets( packetHeader, packetList ); m_packets.clear();