about summary refs log tree commit diff
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2012-04-20 21:39:49 +0200
committeroy <Tom_Adams@web.de>2013-02-24 17:32:48 +0100
commitf1fc3337f5cc5ac3b89da80a1fdff5251f130cb5 (patch)
tree58cd41b26fdeacb48dc63b72a09b9fbc7dac7521
parent4d36c0f77e03475b4057f2de3383105283653230 (diff)
downloadzcatch-f1fc3337f5cc5ac3b89da80a1fdff5251f130cb5.tar.gz
zcatch-f1fc3337f5cc5ac3b89da80a1fdff5251f130cb5.zip
prevent that the server uses close messages from clients. Closes #950
-rw-r--r--src/engine/shared/network.h3
-rw-r--r--src/engine/shared/network_client.cpp2
-rw-r--r--src/engine/shared/network_conn.cpp30
-rw-r--r--src/engine/shared/network_server.cpp2
4 files changed, 21 insertions, 16 deletions
diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h
index d633c3fc..fbe4d391 100644
--- a/src/engine/shared/network.h
+++ b/src/engine/shared/network.h
@@ -140,6 +140,7 @@ private:
 
 	int m_Token;
 	int m_RemoteClosed;
+	bool m_BlockCloseMsg;
 
 	TStaticRingBuffer<CNetChunkResend, NET_CONN_BUFFERSIZE> m_Buffer;
 
@@ -167,7 +168,7 @@ private:
 	void Resend();
 
 public:
-	void Init(NETSOCKET Socket);
+	void Init(NETSOCKET Socket, bool BlockCloseMsg);
 	int Connect(NETADDR *pAddr);
 	void Disconnect(const char *pReason);
 
diff --git a/src/engine/shared/network_client.cpp b/src/engine/shared/network_client.cpp
index 2c035606..8e0e2910 100644
--- a/src/engine/shared/network_client.cpp
+++ b/src/engine/shared/network_client.cpp
@@ -16,7 +16,7 @@ bool CNetClient::Open(NETADDR BindAddr, int Flags)
 
 	// init
 	m_Socket = Socket;
-	m_Connection.Init(m_Socket);
+	m_Connection.Init(m_Socket, false);
 	return true;
 }
 
diff --git a/src/engine/shared/network_conn.cpp b/src/engine/shared/network_conn.cpp
index 6531f5aa..32fa159f 100644
--- a/src/engine/shared/network_conn.cpp
+++ b/src/engine/shared/network_conn.cpp
@@ -37,12 +37,13 @@ void CNetConnection::SetError(const char *pString)
 	str_copy(m_ErrorString, pString, sizeof(m_ErrorString));
 }
 
-void CNetConnection::Init(NETSOCKET Socket)
+void CNetConnection::Init(NETSOCKET Socket, bool BlockCloseMsg)
 {
 	Reset();
 	ResetStats();
 
 	m_Socket = Socket;
+	m_BlockCloseMsg = BlockCloseMsg;
 	mem_zero(m_ErrorString, sizeof(m_ErrorString));
 }
 
@@ -213,21 +214,24 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
 				m_State = NET_CONNSTATE_ERROR;
 				m_RemoteClosed = 1;
 
-				if(pPacket->m_DataSize)
+				if(!m_BlockCloseMsg)
 				{
-					// make sure to sanitize the error string form the other party
-					char Str[128];
-					if(pPacket->m_DataSize < 128)
-						str_copy(Str, (char *)pPacket->m_aChunkData, pPacket->m_DataSize);
+					if(pPacket->m_DataSize)
+					{
+						// make sure to sanitize the error string form the other party
+						char Str[128];
+						if(pPacket->m_DataSize < 128)
+							str_copy(Str, (char *)pPacket->m_aChunkData, pPacket->m_DataSize);
+						else
+							str_copy(Str, (char *)pPacket->m_aChunkData, sizeof(Str));
+						str_sanitize_strong(Str);
+
+						// set the error string
+						SetError(Str);
+					}
 					else
-						str_copy(Str, (char *)pPacket->m_aChunkData, sizeof(Str));
-					str_sanitize_strong(Str);
-
-					// set the error string
-					SetError(Str);
+						SetError("No reason given");
 				}
-				else
-					SetError("No reason given");
 
 				if(g_Config.m_Debug)
 					dbg_msg("conn", "closed reason='%s'", ErrorString());
diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp
index 1264a4a5..add51c9b 100644
--- a/src/engine/shared/network_server.cpp
+++ b/src/engine/shared/network_server.cpp
@@ -30,7 +30,7 @@ bool CNetServer::Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int Ma
 	m_MaxClientsPerIP = MaxClientsPerIP;
 
 	for(int i = 0; i < NET_MAX_CLIENTS; i++)
-		m_aSlots[i].m_Connection.Init(m_Socket);
+		m_aSlots[i].m_Connection.Init(m_Socket, true);
 
 	return true;
 }