mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-12-23 16:32:36 +00:00
Fix buffer overrun with nodeless players
This commit is contained in:
parent
c785fc2132
commit
2857508dfc
1 changed files with 12 additions and 15 deletions
|
|
@ -2485,14 +2485,14 @@ static void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
|
||||||
if (!playeringame[playernum])
|
if (!playeringame[playernum])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (server && !demoplayback)
|
if (server && !demoplayback && playernode[playernum] != UINT8_MAX)
|
||||||
{
|
{
|
||||||
INT32 node = playernode[playernum];
|
INT32 node = playernode[playernum];
|
||||||
playerpernode[node]--;
|
playerpernode[node]--;
|
||||||
if (playerpernode[node] <= 0)
|
if (playerpernode[node] <= 0)
|
||||||
{
|
{
|
||||||
nodeingame[playernode[playernum]] = false;
|
nodeingame[node] = false;
|
||||||
Net_CloseConnection(playernode[playernum]);
|
Net_CloseConnection(node);
|
||||||
ResetNode(node);
|
ResetNode(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2838,16 +2838,13 @@ static void Command_Kick(void)
|
||||||
if (pn == -1 || pn == 0)
|
if (pn == -1 || pn == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (server)
|
// Special case if we are trying to kick a player who is downloading the game state:
|
||||||
|
// trigger a timeout instead of kicking them, because a kick would only
|
||||||
|
// take effect after they have finished downloading
|
||||||
|
if (server && playernode[pn] != UINT8_MAX && sendingsavegame[playernode[pn]])
|
||||||
{
|
{
|
||||||
// Special case if we are trying to kick a player who is downloading the game state:
|
Net_ConnectionTimeout(playernode[pn]);
|
||||||
// trigger a timeout instead of kicking them, because a kick would only
|
return;
|
||||||
// take effect after they have finished downloading
|
|
||||||
if (sendingsavegame[playernode[pn]])
|
|
||||||
{
|
|
||||||
Net_ConnectionTimeout(playernode[pn]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITESINT8(p, pn);
|
WRITESINT8(p, pn);
|
||||||
|
|
@ -2905,7 +2902,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
|
|
||||||
// Is playernum authorized to make this kick?
|
// Is playernum authorized to make this kick?
|
||||||
if (playernum != serverplayer && !IsPlayerAdmin(playernum)
|
if (playernum != serverplayer && !IsPlayerAdmin(playernum)
|
||||||
&& !(playerpernode[playernode[playernum]] == 2
|
&& !(playernode[playernum] != UINT8_MAX && playerpernode[playernode[playernum]] == 2
|
||||||
&& nodetoplayer2[playernode[playernum]] == pnum))
|
&& nodetoplayer2[playernode[playernum]] == pnum))
|
||||||
{
|
{
|
||||||
// We received a kick command from someone who isn't the
|
// We received a kick command from someone who isn't the
|
||||||
|
|
@ -3064,7 +3061,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
}
|
}
|
||||||
else if (keepbody)
|
else if (keepbody)
|
||||||
{
|
{
|
||||||
if (server && !demoplayback)
|
if (server && !demoplayback && playernode[pnum] != UINT8_MAX)
|
||||||
{
|
{
|
||||||
INT32 node = playernode[pnum];
|
INT32 node = playernode[pnum];
|
||||||
playerpernode[node]--;
|
playerpernode[node]--;
|
||||||
|
|
@ -4956,7 +4953,7 @@ void NetUpdate(void)
|
||||||
PingUpdate();
|
PingUpdate();
|
||||||
// update node latency values so we can take an average later.
|
// update node latency values so we can take an average later.
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
if (playeringame[i])
|
if (playeringame[i] && playernode[i] != UINT8_MAX)
|
||||||
realpingtable[i] += G_TicsToMilliseconds(GetLag(playernode[i]));
|
realpingtable[i] += G_TicsToMilliseconds(GetLag(playernode[i]));
|
||||||
pingmeasurecount++;
|
pingmeasurecount++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue