about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-01-18 18:09:09 +0100
committeroy <Tom_Adams@web.de>2011-01-18 18:09:09 +0100
commit8cdabb890f2967d74e801ff090beff454322a81b (patch)
treeaa57cf629ab1f72c21dec83bfa5fa3a56a5268a7 /src
parent0b14286c7f4accc1e38e0c84269d0c50b165a679 (diff)
downloadzcatch-8cdabb890f2967d74e801ff090beff454322a81b.tar.gz
zcatch-8cdabb890f2967d74e801ff090beff454322a81b.zip
fixed that the server crashes on too many snap items (Closes #317), optimised snapshot hashing
Diffstat (limited to 'src')
-rw-r--r--src/engine/shared/snapshot.cpp15
-rw-r--r--src/engine/shared/snapshot.h2
2 files changed, 11 insertions, 6 deletions
diff --git a/src/engine/shared/snapshot.cpp b/src/engine/shared/snapshot.cpp
index ac16a6f8..7ead4320 100644
--- a/src/engine/shared/snapshot.cpp
+++ b/src/engine/shared/snapshot.cpp
@@ -80,7 +80,7 @@ static void GenerateHash(CItemList *pHashlist, CSnapshot *pSnapshot)
 	for(int i = 0; i < pSnapshot->NumItems(); i++)
 	{
 		int Key = pSnapshot->GetItem(i)->Key();
-		int HashID = ((Key>>8)&0xf0) | (Key&0xf);
+		int HashID = ((Key>>12)&0xf0) | (Key&0xf);
 		if(pHashlist[HashID].m_Num != 64)
 		{
 			pHashlist[HashID].m_aIndex[pHashlist[HashID].m_Num] = i;
@@ -92,7 +92,7 @@ static void GenerateHash(CItemList *pHashlist, CSnapshot *pSnapshot)
 
 static int GetItemIndexHashed(int Key, const CItemList *pHashlist)
 {
-		int HashID = ((Key>>8)&0xf0) | (Key&0xf);
+		int HashID = ((Key>>12)&0xf0) | (Key&0xf);
 		for(int i = 0; i < pHashlist[HashID].m_Num; i++)
 		{
 			if(pHashlist[HashID].m_aKeys[i] == Key)
@@ -523,6 +523,14 @@ int CSnapshotBuilder::Finish(void *SpnapData)
 
 void *CSnapshotBuilder::NewItem(int Type, int ID, int Size)
 {
+	if(m_DataSize + sizeof(CSnapshotItem) + Size >= CSnapshot::MAX_SIZE ||
+		m_NumItems+1 >= MAX_ITEMS)
+	{
+		dbg_assert(m_DataSize < CSnapshot::MAX_SIZE, "too much data");
+		dbg_assert(m_NumItems < MAX_ITEMS, "too many items");
+		return 0;
+	}
+
 	CSnapshotItem *pObj = (CSnapshotItem *)(m_aData + m_DataSize);
 
 	mem_zero(pObj, sizeof(CSnapshotItem) + Size);
@@ -530,9 +538,6 @@ void *CSnapshotBuilder::NewItem(int Type, int ID, int Size)
 	m_aOffsets[m_NumItems] = m_DataSize;
 	m_DataSize += sizeof(CSnapshotItem) + Size;
 	m_NumItems++;
-	
-	dbg_assert(m_DataSize < CSnapshot::MAX_SIZE, "too much data");
-	dbg_assert(m_NumItems < MAX_ITEMS, "too many items");
 
 	return pObj->Data();
 }
diff --git a/src/engine/shared/snapshot.h b/src/engine/shared/snapshot.h
index abd25a72..34c3a548 100644
--- a/src/engine/shared/snapshot.h
+++ b/src/engine/shared/snapshot.h
@@ -114,7 +114,7 @@ class CSnapshotBuilder
 {
 	enum
 	{
-		MAX_ITEMS = 1024*2
+		MAX_ITEMS = 1024
 	};
 
 	char m_aData[CSnapshot::MAX_SIZE];