From aa340fd857c151384873f2b29a9bad76e49e852a Mon Sep 17 00:00:00 2001
From: Loic Blot <loic.blot@unix-experience.fr>
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 @@ class SerializationError : public BaseException {
 	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());
 	}
 }
 
-- 
GitLab