From 4c64fcfe8e49219820eac266eb4319ee1e676604 Mon Sep 17 00:00:00 2001 From: Per Inge Mathisen Date: Fri, 15 Feb 2008 21:18:13 +0000 Subject: [PATCH] Sanity check power sync packets, and add net log if power is changed. Add getPower() function to avoid direct access to asPower array. git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@3789 4a71c877-e1ca-e34f-864e-861f7616d084 --- src/multisync.c | 20 ++++++++++++++++---- src/power.c | 9 +++++++++ src/power.h | 3 +++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/multisync.c b/src/multisync.c index ea2d73f43..01412e64b 100644 --- a/src/multisync.c +++ b/src/multisync.c @@ -907,7 +907,7 @@ static BOOL sendPowerCheck() { static UDWORD lastsent = 0; uint8_t player = selectedPlayer; - uint32_t power = asPower[player]->currentPower; + uint32_t power = getPower(player); if (lastsent > gameTime) { @@ -931,14 +931,26 @@ static BOOL sendPowerCheck() BOOL recvPowerCheck() { uint8_t player; - uint32_t power; + uint32_t power, power2; NETbeginDecode(NET_CHECK_POWER); NETuint8_t(&player); NETuint32_t(&power); NETend(); - - setPower(player, power); + + if (player >= MAX_PLAYERS) + { + debug(LOG_ERROR, "Bad NET_CHECK_POWER packet: player is %d", (int)player); + return FALSE; + } + + power2 = getPower(player); + if (power != power2) + { + debug(LOG_NET, "NET_CHECK_POWER: Adjusting power for player %d from %u to %u", + (int)player, power2, power); + setPower(player, power); + } return TRUE; } diff --git a/src/power.c b/src/power.c index ec3b95d88..e06ef7b37 100644 --- a/src/power.c +++ b/src/power.c @@ -337,6 +337,15 @@ void setPower(UDWORD player, UDWORD avail) asPower[player]->currentPower = avail; } +// only used in multiplayer games. +UDWORD getPower(UDWORD player) +{ + ASSERT(player < MAX_PLAYERS, "setPower: Bad player (%u)", player); + ASSERT(asPower[player] != NULL, "asPower[player=%u] not allocated", player); + + return asPower[player]->currentPower; +} + /*sets the initial value for the power*/ void setPlayerPower(UDWORD power, UDWORD player) { diff --git a/src/power.h b/src/power.h index 120356b67..a3ab0e487 100644 --- a/src/power.h +++ b/src/power.h @@ -75,6 +75,9 @@ extern void updatePlayerPower(UDWORD player); // used in multiplayer to force power levels. extern void setPower(UDWORD player, UDWORD avail); +/** Get the amount of power current held by the given player. */ +extern UDWORD getPower(UDWORD player); + /*resets the power levels for all players when power is turned back on*/ void powerCalc(BOOL on);