diff options
| author | oy <Tom_Adams@web.de> | 2011-01-18 18:09:09 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-01-18 18:09:09 +0100 |
| commit | 8cdabb890f2967d74e801ff090beff454322a81b (patch) | |
| tree | aa57cf629ab1f72c21dec83bfa5fa3a56a5268a7 /src/engine | |
| parent | 0b14286c7f4accc1e38e0c84269d0c50b165a679 (diff) | |
| download | zcatch-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/engine')
| -rw-r--r-- | src/engine/shared/snapshot.cpp | 15 | ||||
| -rw-r--r-- | src/engine/shared/snapshot.h | 2 |
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]; |