about summary refs log tree commit diff
path: root/src/banmaster/banmaster.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/banmaster/banmaster.cpp')
-rw-r--r--src/banmaster/banmaster.cpp41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/banmaster/banmaster.cpp b/src/banmaster/banmaster.cpp
index 97eb2aee..a8a5ad02 100644
--- a/src/banmaster/banmaster.cpp
+++ b/src/banmaster/banmaster.cpp
@@ -97,15 +97,9 @@ void CleanUp()
 	delete m_pStorage;
 }
 
-int SendResponse(NETADDR *pAddr, NETADDR *pCheck)
+int SendResponse(NETADDR *pAddr, NETADDR *pCheck, const char *pToken)
 {
-	static char aIpBan[sizeof(BANMASTER_IPBAN) + NETADDR_MAXSTRSIZE] = { 0 };
-	static char *pIpBanContent = aIpBan + sizeof(BANMASTER_IPBAN);
-
-	if (!aIpBan[0])
-		mem_copy(aIpBan, BANMASTER_IPBAN, sizeof(BANMASTER_IPBAN));
-
-	static CNetChunk p;
+	CNetChunk p;
 
 	p.m_ClientID = -1;
 	p.m_Address = *pAddr;
@@ -116,13 +110,20 @@ int SendResponse(NETADDR *pAddr, NETADDR *pCheck)
 
 	if(m_NetBan.GetBanInfo(pCheck, aReason, sizeof(aReason), &Expires))
 	{
-		net_addr_str(pCheck, pIpBanContent, NETADDR_MAXSTRSIZE, false);
-		char *pIpBanReason = pIpBanContent + (str_length(pIpBanContent) + 1);
-		str_copy(pIpBanReason, aReason, 256);
+		char aCheckAddr[NETADDR_MAXSTRSIZE];
+		net_addr_str(pCheck, aCheckAddr, NETADDR_MAXSTRSIZE, false);
+
+		CPacker P;
+		P.Reset();
+		P.AddRaw(BANMASTER_IPBAN, sizeof(BANMASTER_IPBAN));
+		P.AddString(aCheckAddr, -1);
+		P.AddString(aReason, -1);
+		P.AddString(pToken, -1);
 		
-		p.m_pData = aIpBan;
-		p.m_DataSize = sizeof(BANMASTER_IPBAN) + str_length(pIpBanContent) + 1 + str_length(pIpBanReason) + 1;
-		m_Net.Send(&p);
+		p.m_pData = P.Data();
+		p.m_DataSize = P.Size();
+		if(!P.Error())
+			m_Net.Send(&p);
 		return 1;
 	}
 
@@ -141,7 +142,7 @@ void AddRecvBan(NETADDR *pFromAddr, unsigned char *pData, int Size)
 	pReason = Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
 
 	NETADDR ReportAddr;
-	if(net_addr_from_str(&ReportAddr, pIP) == 0 && pName[0] && pReason[0])
+	if(!Up.Error() && net_addr_from_str(&ReportAddr, pIP) == 0 && pName[0] && pReason[0])
 	{
 		for(int i = MAX_BAN_ENTRIES-1; i > 0; i--)
 			mem_copy(&m_RecvBans[i], &m_RecvBans[i-1], sizeof(m_RecvBans[i]));
@@ -287,9 +288,13 @@ int main(int argc, const char **argv) // ignore_convention
 
 			if(Packet.m_DataSize >= (int)sizeof(BANMASTER_IPCHECK) && mem_comp(Packet.m_pData, BANMASTER_IPCHECK, sizeof(BANMASTER_IPCHECK)) == 0)
 			{
-				char *pAddr = (char *)Packet.m_pData + sizeof(BANMASTER_IPCHECK);
+				CUnpacker Up;
+				Up.Reset((unsigned char*) Packet.m_pData + sizeof(BANMASTER_IPCHECK), Packet.m_DataSize - sizeof(BANMASTER_IPCHECK));
+				const char *pAddr = Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
+				const char *pToken = Up.GetString(CUnpacker::SANITIZE_CC);
+
 				NETADDR CheckAddr;
-				if(net_addr_from_str(&CheckAddr, pAddr))
+				if(net_addr_from_str(&CheckAddr, pAddr) || Up.Error())
 				{
 					char aBuf[128];
 					str_format(aBuf, sizeof(aBuf), "dropped weird message, ip='%s' checkaddr='%s'", aAddressStr, pAddr);
@@ -299,7 +304,7 @@ int main(int argc, const char **argv) // ignore_convention
 				{
 					CheckAddr.port = 0;
 
-					int Banned = SendResponse(&Packet.m_Address, &CheckAddr);
+					int Banned = SendResponse(&Packet.m_Address, &CheckAddr, pToken);
 
 					char aIP[NETADDR_MAXSTRSIZE];
 					char aBuf[256];