From aa340fd857c151384873f2b29a9bad76e49e852a Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Fri, 3 Apr 2015 08:53:31 +0200 Subject: [PATCH] Create PacketError exception and use it with ACTIVEOBJECT_REMOVE_ADD handler which can be unreliable --- src/exceptions.h | 5 +++++ src/network/clientpackethandler.cpp | 32 ++++++++++++++++------------- src/network/networkpacket.cpp | 2 +- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/exceptions.h b/src/exceptions.h index 5b716c2ca..0ea4c9350 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -70,6 +70,11 @@ public: SerializationError(const std::string &s): BaseException(s) {} }; +class PacketError : public BaseException { +public: + PacketError(const std::string &s): BaseException(s) {} +}; + class LoadError : public BaseException { public: LoadError(const std::string &s): BaseException(s) {} diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 4afe2a2ce..a9096accc 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -336,7 +336,6 @@ void Client::handleCommand_ChatMessage(NetworkPacket* pkt) void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt) { /* - u16 command u16 count of removed objects for all removed objects { u16 id @@ -350,23 +349,28 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt) } */ - // Read removed objects - u8 type; - u16 removed_count, added_count, id; + try { + u8 type; + u16 removed_count, added_count, id; - *pkt >> removed_count; + // Read removed objects + *pkt >> removed_count; - for (u16 i = 0; i < removed_count; i++) { - *pkt >> id; - m_env.removeActiveObject(id); - } + for (u16 i = 0; i < removed_count; i++) { + *pkt >> id; + m_env.removeActiveObject(id); + } - // Read added objects - *pkt >> added_count; + // Read added objects + *pkt >> added_count; - for (u16 i = 0; i < added_count; i++) { - *pkt >> id >> type; - m_env.addActiveObject(id, type, pkt->readLongString()); + for (u16 i = 0; i < added_count; i++) { + *pkt >> id >> type; + m_env.addActiveObject(id, type, pkt->readLongString()); + } + } catch (PacketError &e) { + infostream << "handleCommand_ActiveObjectRemoveAdd: " << e.what() + << ". The packet is unreliable, ignoring" << std::endl; } } diff --git a/src/network/networkpacket.cpp b/src/network/networkpacket.cpp index 95605d410..a4a481db4 100644 --- a/src/network/networkpacket.cpp +++ b/src/network/networkpacket.cpp @@ -45,7 +45,7 @@ void NetworkPacket::checkReadOffset(u32 from_offset) std::stringstream ss; ss << "Reading outside packet (offset: " << from_offset << ", packet size: " << getSize() << ")"; - throw SerializationError(ss.str()); + throw PacketError(ss.str()); } }