From 8804c47e59b550ec9a533de662f086af623d68c1 Mon Sep 17 00:00:00 2001
From: Loic Blot <loic.blot@unix-experience.fr>
Date: Sun, 5 Apr 2015 11:37:53 +0200
Subject: [PATCH] TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD can be unreliable, catch
 PacketError exception. Also set the packet size at creation not when pushing
 rawString, no functional change

---
 src/network/clientpackethandler.cpp | 35 ++++++++++++++++-------------
 src/server.cpp                      |  4 ++--
 2 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index a9096accc..68d4245f8 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -377,7 +377,6 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
 void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt)
 {
 	/*
-		u16 command
 		for all objects
 		{
 			u16 id
@@ -391,21 +390,27 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt)
 	// Throw them in an istringstream
 	std::istringstream is(datastring, std::ios_base::binary);
 
-	while(is.eof() == false) {
-		is.read(buf, 2);
-		u16 id = readU16((u8*)buf);
-		if (is.eof())
-			break;
-		is.read(buf, 2);
-		size_t message_size = readU16((u8*)buf);
-		std::string message;
-		message.reserve(message_size);
-		for (u32 i = 0; i < message_size; i++) {
-			is.read(buf, 1);
-			message.append(buf, 1);
+	try {
+		while(is.eof() == false) {
+			is.read(buf, 2);
+			u16 id = readU16((u8*)buf);
+			if (is.eof())
+				break;
+			is.read(buf, 2);
+			size_t message_size = readU16((u8*)buf);
+			std::string message;
+			message.reserve(message_size);
+			for (u32 i = 0; i < message_size; i++) {
+				is.read(buf, 1);
+				message.append(buf, 1);
+			}
+			// Pass on to the environment
+			m_env.processActiveObjectMessage(id, message);
 		}
-		// Pass on to the environment
-		m_env.processActiveObjectMessage(id, message);
+	// Packet could be unreliable then ignore it
+	} catch (PacketError &e) {
+		infostream << "handleCommand_ActiveObjectMessages: " << e.what()
+					<< ". The packet is unreliable, ignoring" << std::endl;
 	}
 }
 
diff --git a/src/server.cpp b/src/server.cpp
index 4971e6f66..cb62f7e86 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1897,7 +1897,7 @@ void Server::SendPlayerInventoryFormspec(u16 peer_id)
 
 u32 Server::SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas)
 {
-	NetworkPacket pkt(TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD, 0, peer_id);
+	NetworkPacket pkt(TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD, datas.size(), peer_id);
 	pkt.putRawString(datas.c_str(), datas.size());
 	Send(&pkt);
 	return pkt.getSize();
@@ -1906,7 +1906,7 @@ u32 Server::SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas)
 void Server::SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable)
 {
 	NetworkPacket pkt(TOCLIENT_ACTIVE_OBJECT_MESSAGES,
-			0, peer_id);
+			datas.size(), peer_id);
 
 	pkt.putRawString(datas.c_str(), datas.size());
 
-- 
GitLab