Prevent out of bounds access of player stat arrays.
In the 2.3 netcode, we use player 9 for features, while we only have stats for players 0-7. Fixes #2029 and probably a truckoad of other random problems. git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@11323 4a71c877-e1ca-e34f-864e-861f7616d084master
parent
943af316ec
commit
324722fc93
|
@ -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,42 +210,48 @@ 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(myResponsibility(attacker) && NetPlay.bComms)
|
||||
if (attacker < MAX_PLAYERS)
|
||||
{
|
||||
st = getMultiStats(attacker); // get stats
|
||||
if(NetPlay.bComms)
|
||||
if (myResponsibility(attacker) && NetPlay.bComms)
|
||||
{
|
||||
st.scoreToAdd += (2*inflicted);
|
||||
st = getMultiStats(attacker); // get stats
|
||||
if (NetPlay.bComms)
|
||||
{
|
||||
st.scoreToAdd += (2 * inflicted);
|
||||
}
|
||||
else
|
||||
{
|
||||
st.recentScore += (2 * inflicted);
|
||||
}
|
||||
setMultiStats(attacker, st, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
st.recentScore += (2*inflicted);
|
||||
ingame.skScores[attacker][0] += (2 * inflicted); // increment skirmish players rough score.
|
||||
}
|
||||
setMultiStats(attacker, st, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
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(myResponsibility(defender) && NetPlay.bComms)
|
||||
if (defender < MAX_PLAYERS)
|
||||
{
|
||||
st = getMultiStats(defender); // get stats
|
||||
if(NetPlay.bComms)
|
||||
if (myResponsibility(defender) && NetPlay.bComms)
|
||||
{
|
||||
st.scoreToAdd -= inflicted;
|
||||
st = getMultiStats(defender); // get stats
|
||||
if (NetPlay.bComms)
|
||||
{
|
||||
st.scoreToAdd -= inflicted;
|
||||
}
|
||||
else
|
||||
{
|
||||
st.recentScore -= inflicted;
|
||||
}
|
||||
setMultiStats(defender, st, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
st.recentScore -= inflicted;
|
||||
ingame.skScores[defender][0] -= inflicted; // increment skirmish players rough score.
|
||||
}
|
||||
setMultiStats(defender, st, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ingame.skScores[defender][0] -= inflicted; // increment skirmish players rough score.
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue