about summary refs log tree commit diff
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2010-12-16 03:29:08 +0100
committeroy <Tom_Adams@web.de>2010-12-16 03:29:08 +0100
commit0121f273112624d531d57fb37cb1bdf9e7c537df (patch)
treeed517e71def6310b13e2ab491ce1b6bee4ac904d
parent54f138f89445def6060209d21f153b1e5378d58d (diff)
downloadzcatch-0121f273112624d531d57fb37cb1bdf9e7c537df.tar.gz
zcatch-0121f273112624d531d57fb37cb1bdf9e7c537df.zip
fixed server crash on too many snap items. Closes #317
-rw-r--r--src/engine/server/server.cpp6
-rw-r--r--src/game/server/entities/character.cpp38
-rw-r--r--src/game/server/entities/flag.cpp3
-rw-r--r--src/game/server/entities/laser.cpp3
-rw-r--r--src/game/server/entities/pickup.cpp3
-rw-r--r--src/game/server/entities/projectile.cpp3
-rw-r--r--src/game/server/eventhandler.cpp3
-rw-r--r--src/game/server/gamecontroller.cpp3
-rw-r--r--src/game/server/player.cpp37
9 files changed, 62 insertions, 37 deletions
diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp
index e45ea846..299919dd 100644
--- a/src/engine/server/server.cpp
+++ b/src/engine/server/server.cpp
@@ -115,6 +115,8 @@ int CSnapIDPool::NewID()
 	
 	int Id = m_FirstFree;
 	dbg_assert(Id != -1, "id error");
+	if(Id == -1)
+		return Id;
 	m_FirstFree = m_aIDs[m_FirstFree].m_Next;
 	m_aIDs[Id].m_State = 1;
 	m_Usage++;
@@ -131,6 +133,8 @@ void CSnapIDPool::TimeoutIDs()
 
 void CSnapIDPool::FreeID(int Id)
 {
+	if(Id < 0)
+		return;
 	dbg_assert(m_aIDs[Id].m_State == 1, "id is not alloced");
 
 	m_InUsage--;
@@ -1481,7 +1485,7 @@ void *CServer::SnapNewItem(int Type, int Id, int Size)
 {
 	dbg_assert(Type >= 0 && Type <=0xffff, "incorrect type");
 	dbg_assert(Id >= 0 && Id <=0xffff, "incorrect id");
-	return m_SnapshotBuilder.NewItem(Type, Id, Size);		
+	return Id < 0 ? 0 : m_SnapshotBuilder.NewItem(Type, Id, Size);		
 }
 
 void CServer::SnapSetStaticsize(int ItemType, int Size)
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp
index 581b0357..e29b778b 100644
--- a/src/game/server/entities/character.cpp
+++ b/src/game/server/entities/character.cpp
@@ -793,20 +793,22 @@ void CCharacter::Snap(int SnappingClient)
 	if(NetworkClipped(SnappingClient))
 		return;
 	
-	CNetObj_Character *Character = static_cast<CNetObj_Character *>(Server()->SnapNewItem(NETOBJTYPE_CHARACTER, m_pPlayer->GetCID(), sizeof(CNetObj_Character)));
+	CNetObj_Character *pCharacter = static_cast<CNetObj_Character *>(Server()->SnapNewItem(NETOBJTYPE_CHARACTER, m_pPlayer->GetCID(), sizeof(CNetObj_Character)));
+	if(!pCharacter)
+		return;
 	
 	// write down the m_Core
 	if(!m_ReckoningTick || GameServer()->m_World.m_Paused)
 	{
 		// no dead reckoning when paused because the client doesn't know
 		// how far to perform the reckoning
-		Character->m_Tick = 0;
-		m_Core.Write(Character);
+		pCharacter->m_Tick = 0;
+		m_Core.Write(pCharacter);
 	}
 	else
 	{
-		Character->m_Tick = m_ReckoningTick;
-		m_SendCore.Write(Character);
+		pCharacter->m_Tick = m_ReckoningTick;
+		m_SendCore.Write(pCharacter);
 	}
 	
 	// set emote
@@ -816,30 +818,30 @@ void CCharacter::Snap(int SnappingClient)
 		m_EmoteStop = -1;
 	}
 
-	Character->m_Emote = m_EmoteType;
+	pCharacter->m_Emote = m_EmoteType;
 
-	Character->m_AmmoCount = 0;
-	Character->m_Health = 0;
-	Character->m_Armor = 0;
+	pCharacter->m_AmmoCount = 0;
+	pCharacter->m_Health = 0;
+	pCharacter->m_Armor = 0;
 	
-	Character->m_Weapon = m_ActiveWeapon;
-	Character->m_AttackTick = m_AttackTick;
+	pCharacter->m_Weapon = m_ActiveWeapon;
+	pCharacter->m_AttackTick = m_AttackTick;
 
-	Character->m_Direction = m_Input.m_Direction;
+	pCharacter->m_Direction = m_Input.m_Direction;
 
 	if(m_pPlayer->GetCID() == SnappingClient)
 	{
-		Character->m_Health = m_Health;
-		Character->m_Armor = m_Armor;
+		pCharacter->m_Health = m_Health;
+		pCharacter->m_Armor = m_Armor;
 		if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0)
-			Character->m_AmmoCount = m_aWeapons[m_ActiveWeapon].m_Ammo;
+			pCharacter->m_AmmoCount = m_aWeapons[m_ActiveWeapon].m_Ammo;
 	}
 
-	if (Character->m_Emote == EMOTE_NORMAL)
+	if(pCharacter->m_Emote == EMOTE_NORMAL)
 	{
 		if(250 - ((Server()->Tick() - m_LastAction)%(250)) < 5)
-			Character->m_Emote = EMOTE_BLINK;
+			pCharacter->m_Emote = EMOTE_BLINK;
 	}
 
-	Character->m_PlayerState = m_PlayerState;
+	pCharacter->m_PlayerState = m_PlayerState;
 }
diff --git a/src/game/server/entities/flag.cpp b/src/game/server/entities/flag.cpp
index e155f848..4d034214 100644
--- a/src/game/server/entities/flag.cpp
+++ b/src/game/server/entities/flag.cpp
@@ -26,6 +26,9 @@ void CFlag::Reset()
 void CFlag::Snap(int SnappingClient)
 {
 	CNetObj_Flag *pFlag = (CNetObj_Flag *)Server()->SnapNewItem(NETOBJTYPE_FLAG, m_Team, sizeof(CNetObj_Flag));
+	if(!pFlag)
+		return;
+
 	pFlag->m_X = (int)m_Pos.x;
 	pFlag->m_Y = (int)m_Pos.y;
 	pFlag->m_Team = m_Team;
diff --git a/src/game/server/entities/laser.cpp b/src/game/server/entities/laser.cpp
index 1c598e6b..17eb4332 100644
--- a/src/game/server/entities/laser.cpp
+++ b/src/game/server/entities/laser.cpp
@@ -98,6 +98,9 @@ void CLaser::Snap(int SnappingClient)
 		return;
 
 	CNetObj_Laser *pObj = static_cast<CNetObj_Laser *>(Server()->SnapNewItem(NETOBJTYPE_LASER, m_Id, sizeof(CNetObj_Laser)));
+	if(!pObj)
+		return;
+
 	pObj->m_X = (int)m_Pos.x;
 	pObj->m_Y = (int)m_Pos.y;
 	pObj->m_FromX = (int)m_From.x;
diff --git a/src/game/server/entities/pickup.cpp b/src/game/server/entities/pickup.cpp
index 87be87e7..a2c6f650 100644
--- a/src/game/server/entities/pickup.cpp
+++ b/src/game/server/entities/pickup.cpp
@@ -126,6 +126,9 @@ void CPickup::Snap(int SnappingClient)
 		return;
 
 	CNetObj_Pickup *pP = static_cast<CNetObj_Pickup *>(Server()->SnapNewItem(NETOBJTYPE_PICKUP, m_Id, sizeof(CNetObj_Pickup)));
+	if(!pP)
+		return;
+
 	pP->m_X = (int)m_Pos.x;
 	pP->m_Y = (int)m_Pos.y;
 	pP->m_Type = m_Type;
diff --git a/src/game/server/entities/projectile.cpp b/src/game/server/entities/projectile.cpp
index f45fe99d..5b3bc482 100644
--- a/src/game/server/entities/projectile.cpp
+++ b/src/game/server/entities/projectile.cpp
@@ -100,5 +100,6 @@ void CProjectile::Snap(int SnappingClient)
 		return;
 
 	CNetObj_Projectile *pProj = static_cast<CNetObj_Projectile *>(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_Id, sizeof(CNetObj_Projectile)));
-	FillInfo(pProj);
+	if(pProj)
+		FillInfo(pProj);
 }
diff --git a/src/game/server/eventhandler.cpp b/src/game/server/eventhandler.cpp
index 25eddba2..deb1ca4e 100644
--- a/src/game/server/eventhandler.cpp
+++ b/src/game/server/eventhandler.cpp
@@ -50,7 +50,8 @@ void CEventHandler::Snap(int SnappingClient)
 			if(SnappingClient == -1 || distance(GameServer()->m_apPlayers[SnappingClient]->m_ViewPos, vec2(ev->m_X, ev->m_Y)) < 1500.0f)
 			{
 				void *d = GameServer()->Server()->SnapNewItem(m_aTypes[i], i, m_aSizes[i]);
-				mem_copy(d, &m_aData[m_aOffsets[i]], m_aSizes[i]);
+				if(d)
+					mem_copy(d, &m_aData[m_aOffsets[i]], m_aSizes[i]);
 			}
 		}
 	}
diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp
index f9b797e7..e6f60141 100644
--- a/src/game/server/gamecontroller.cpp
+++ b/src/game/server/gamecontroller.cpp
@@ -535,6 +535,9 @@ bool IGameController::IsTeamplay() const
 void IGameController::Snap(int SnappingClient)
 {
 	CNetObj_Game *pGameObj = (CNetObj_Game *)Server()->SnapNewItem(NETOBJTYPE_GAME, 0, sizeof(CNetObj_Game));
+	if(!pGameObj)
+		return;
+
 	pGameObj->m_Paused = GameServer()->m_World.m_Paused;
 	pGameObj->m_GameOver = m_GameOverTick==-1?0:1;
 	pGameObj->m_SuddenDeath = m_SuddenDeath;
diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp
index e76c5e56..03d715a4 100644
--- a/src/game/server/player.cpp
+++ b/src/game/server/player.cpp
@@ -78,24 +78,29 @@ void CPlayer::Snap(int SnappingClient)
 	if(!Server()->ClientIngame(m_ClientID))
 		return;
 
-	CNetObj_ClientInfo *ClientInfo = static_cast<CNetObj_ClientInfo *>(Server()->SnapNewItem(NETOBJTYPE_CLIENTINFO, m_ClientID, sizeof(CNetObj_ClientInfo)));
-	StrToInts(&ClientInfo->m_Name0, 6, Server()->ClientName(m_ClientID));
-	StrToInts(&ClientInfo->m_Skin0, 6, m_TeeInfos.m_SkinName);
-	ClientInfo->m_UseCustomColor = m_TeeInfos.m_UseCustomColor;
-	ClientInfo->m_ColorBody = m_TeeInfos.m_ColorBody;
-	ClientInfo->m_ColorFeet = m_TeeInfos.m_ColorFeet;
-
-	CNetObj_PlayerInfo *Info = static_cast<CNetObj_PlayerInfo *>(Server()->SnapNewItem(NETOBJTYPE_PLAYERINFO, m_ClientID, sizeof(CNetObj_PlayerInfo)));
-
-	Info->m_Latency = m_Latency.m_Min;
-	Info->m_LatencyFlux = m_Latency.m_Max-m_Latency.m_Min;
-	Info->m_Local = 0;
-	Info->m_ClientId = m_ClientID;
-	Info->m_Score = m_Score;
-	Info->m_Team = m_Team;
+	CNetObj_ClientInfo *pClientInfo = static_cast<CNetObj_ClientInfo *>(Server()->SnapNewItem(NETOBJTYPE_CLIENTINFO, m_ClientID, sizeof(CNetObj_ClientInfo)));
+	if(!pClientInfo)
+		return;
+
+	StrToInts(&pClientInfo->m_Name0, 6, Server()->ClientName(m_ClientID));
+	StrToInts(&pClientInfo->m_Skin0, 6, m_TeeInfos.m_SkinName);
+	pClientInfo->m_UseCustomColor = m_TeeInfos.m_UseCustomColor;
+	pClientInfo->m_ColorBody = m_TeeInfos.m_ColorBody;
+	pClientInfo->m_ColorFeet = m_TeeInfos.m_ColorFeet;
+
+	CNetObj_PlayerInfo *pPlayerInfo = static_cast<CNetObj_PlayerInfo *>(Server()->SnapNewItem(NETOBJTYPE_PLAYERINFO, m_ClientID, sizeof(CNetObj_PlayerInfo)));
+	if(!pPlayerInfo)
+		return;
+
+	pPlayerInfo->m_Latency = m_Latency.m_Min;
+	pPlayerInfo->m_LatencyFlux = m_Latency.m_Max-m_Latency.m_Min;
+	pPlayerInfo->m_Local = 0;
+	pPlayerInfo->m_ClientId = m_ClientID;
+	pPlayerInfo->m_Score = m_Score;
+	pPlayerInfo->m_Team = m_Team;
 
 	if(m_ClientID == SnappingClient)
-		Info->m_Local = 1;	
+		pPlayerInfo->m_Local = 1;	
 }
 
 void CPlayer::OnDisconnect()