From d92d376148f7ed35df1c757aab5eca5645bb8ddd Mon Sep 17 00:00:00 2001
From: est31 <MTest31@outlook.com>
Date: Sun, 5 Jul 2015 21:05:07 +0200
Subject: [PATCH] Client: better m_proto_ver initialisation

Previously, m_proto_ver was set to the serialisation version
inside the legacy init packet.

Now, if the server doesn't send a protocol version (protocols < 25),
we set m_proto_ver to some value < 25 and > 0.
---
 src/client.cpp                      |  1 +
 src/client.h                        |  6 ++++++
 src/network/clientpackethandler.cpp | 15 +++++++++------
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/client.cpp b/src/client.cpp
index b02e6229c..2f8babfa2 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -229,6 +229,7 @@ Client::Client(
 	m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this),
 	m_device(device),
 	m_server_ser_ver(SER_FMT_VER_INVALID),
+	m_proto_ver(0),
 	m_playeritem(0),
 	m_inventory_updated(false),
 	m_inventory_from_server(NULL),
diff --git a/src/client.h b/src/client.h
index efd373e42..7c1a19eed 100644
--- a/src/client.h
+++ b/src/client.h
@@ -595,8 +595,14 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
 	Mapper *m_mapper;
 	// Server serialization version
 	u8 m_server_ser_ver;
+
 	// Used version of the protocol with server
+	// Values smaller than 25 only mean they are smaller than 25,
+	// and aren't accurate. We simply just don't know, because
+	// the server didn't send the version back then.
+	// If 0, server init hasn't been received yet.
 	u8 m_proto_ver;
+
 	u16 m_playeritem;
 	bool m_inventory_updated;
 	Inventory *m_inventory_from_server;
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index c0acff985..1ec6a2a1a 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -151,20 +151,23 @@ void Client::handleCommand_InitLegacy(NetworkPacket* pkt)
 	if (pkt->getSize() < 1)
 		return;
 
-	u8 deployed;
-	*pkt >> deployed;
+	u8 server_ser_ver;
+	*pkt >> server_ser_ver;
 
 	infostream << "Client: TOCLIENT_INIT_LEGACY received with "
-			"deployed=" << ((int)deployed & 0xff) << std::endl;
+		"server_ser_ver=" << ((int)server_ser_ver & 0xff) << std::endl;
 
-	if (!ser_ver_supported(deployed)) {
+	if (!ser_ver_supported(server_ser_ver)) {
 		infostream << "Client: TOCLIENT_INIT_LEGACY: Server sent "
 				<< "unsupported ser_fmt_ver"<< std::endl;
 		return;
 	}
 
-	m_server_ser_ver = deployed;
-	m_proto_ver = deployed;
+	m_server_ser_ver = server_ser_ver;
+
+	// We can be totally wrong with this guess
+	// but we only need some value < 25.
+	m_proto_ver = 24;
 
 	// Get player position
 	v3s16 playerpos_s16(0, BS * 2 + BS * 20, 0);
-- 
GitLab