diff --git a/src/multistat.c b/src/multistat.c
index ee3b933..28500a3 100644
--- a/src/multistat.c
+++ b/src/multistat.c
@@ -52,6 +52,11 @@ BOOL setMultiStats(SDWORD player, PLAYERSTATS plStats, BOOL bLocal)
 {
 	uint32_t playerIndex = (uint32_t)player;
 
+	if (playerIndex >= MAX_PLAYERS)
+	{
+		return true;
+	}
+
 	// First copy over the data into our local array
 	memcpy(&playerStats[playerIndex], &plStats, sizeof(plStats));
 
@@ -87,6 +92,11 @@ void recvMultiStats()
 		// update the stats
 		NETuint32_t(&playerIndex);
 
+		if (playerIndex >= MAX_PLAYERS)
+		{
+			return;
+		}
+
 		// we don't what to update ourselves, we already know our score (FIXME: rewrite setMultiStats())
 		if (!myResponsibility(playerIndex))
 		{
@@ -200,6 +210,8 @@ void updateMultiStatsDamage(UDWORD attacker, UDWORD defender, UDWORD inflicted)
 	}
 	// FIXME: Why in the world are we using two different structs for stats when we can use only one?
 	// Host controls self + AI, so update the scores for them as well.
+	if (attacker < MAX_PLAYERS)
+	{
 	if(myResponsibility(attacker) && NetPlay.bComms)
 	{
 		st = getMultiStats(attacker);	// get stats
@@ -217,9 +229,12 @@ void updateMultiStatsDamage(UDWORD attacker, UDWORD defender, UDWORD inflicted)
 	{
 		ingame.skScores[attacker][0] += (2*inflicted);	// increment skirmish players rough score.
 	}
+	}
 
 	// FIXME: Why in the world are we using two different structs for stats when we can use only one?
 	// Host controls self + AI, so update the scores for them as well.
+	if (defender < MAX_PLAYERS)
+	{
 	if(myResponsibility(defender) && NetPlay.bComms)
 	{
 		st = getMultiStats(defender);	// get stats
@@ -238,6 +253,7 @@ void updateMultiStatsDamage(UDWORD attacker, UDWORD defender, UDWORD inflicted)
 		ingame.skScores[defender][0] -= inflicted;	// increment skirmish players rough score.
 	}
 }
+}
 
 // update games played.
 void updateMultiStatsGames(void)

