From 59c4a342a9625fe37e9a7aa755e6deca14c3a110 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Tue, 3 May 2011 17:33:51 +0300
Subject: [PATCH] Fixed a temporary solution of server shutting down to an
 assert(0) when a too large block metadata is sent to an old client

---
 src/mapblock.cpp | 14 +++++++++++---
 src/utility.h    |  4 +++-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index f84c65176..67e7e2574 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -2109,9 +2109,17 @@ void MapBlock::serialize(std::ostream &os, u8 version)
 		{
 			if(version <= 15)
 			{
-				std::ostringstream oss(std::ios_base::binary);
-				m_node_metadata.serialize(oss);
-				os<<serializeString(oss.str());
+				try{
+					std::ostringstream oss(std::ios_base::binary);
+					m_node_metadata.serialize(oss);
+					os<<serializeString(oss.str());
+				}
+				// This will happen if the string is longer than 65535
+				catch(SerializationError &e)
+				{
+					// Use an empty string
+					os<<serializeString("");
+				}
 			}
 			else
 			{
diff --git a/src/utility.h b/src/utility.h
index 5cb3080a7..12d732bea 100644
--- a/src/utility.h
+++ b/src/utility.h
@@ -1911,7 +1911,9 @@ inline v3f intToFloat(v3s16 p, f32 d)
 // Creates a string with the length as the first two bytes
 inline std::string serializeString(const std::string &plain)
 {
-	assert(plain.size() <= 65535);
+	//assert(plain.size() <= 65535);
+	if(plain.size() > 65535)
+		throw SerializationError("String too long for serializeString");
 	char buf[2];
 	writeU16((u8*)&buf[0], plain.size());
 	std::string s;
-- 
GitLab