netcode: replace some stuff with memsets + add a little bounds safety in some places

This commit is contained in:
Alug 2025-12-11 09:55:02 -05:00 committed by NepDisk
parent 9c1fe512fc
commit b964df8137
4 changed files with 45 additions and 40 deletions

View file

@ -2261,8 +2261,10 @@ static void CL_ConnectToServer(void)
{
pnumnodes = 0;
for (i = 0; i < MAXNETNODES; i++)
{
if (nodeingame[i])
pnumnodes++;
}
}
}
while (!(cl_mode == CL_CONNECTED && (client || (server && nodewaited <= pnumnodes))));
@ -3691,8 +3693,10 @@ void D_QuitNetGame(void)
netbuffer->packettype = PT_SERVERSHUTDOWN;
for (i = 0; i < MAXNETNODES; i++)
{
if (nodeingame[i])
HSendPacket(i, true, 0, 0);
}
#ifdef MASTERSERVER
if (serverrunning && netgame && cv_advertise.value) // see mserv.c Online()
UnregisterServer();
@ -6236,8 +6240,10 @@ static inline void PingUpdate(void)
//send out our ping packets
for (i = 0; i < MAXNETNODES; i++)
{
if (nodeingame[i])
HSendPacket(i, true, 0, sizeof(netinfo_pak));
}
pingmeasurecount = 0; //Reset count
}
@ -6340,8 +6346,10 @@ static void HandleNodeTimeouts(void)
if (server)
{
for (i = 1; i < MAXNETNODES; i++)
{
if (nodeingame[i] && freezetimeout[i] < I_GetTime())
Net_ConnectionTimeout(i);
}
// In case the cvar value was lowered
if (joindelay)

View file

@ -632,13 +632,8 @@ void Net_WaitAllAckReceived(UINT32 timeout)
static void InitNode(netnode_t *node)
{
node->acktosend_head = node->acktosend_tail = 0;
node->firstacktosend = 0;
memset(node, 0, sizeof(node_t));
node->nextacknum = 1;
node->remotefirstack = 0;
node->flags = 0;
node->sendnum = 0;
node->recvnum = 0;
}
static void InitAck(void)

View file

@ -674,18 +674,18 @@ boolean CL_LoadServerFiles(void)
const char *s;
switch(fileneeded[i].status)
{
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_REQUESTED:
s = "FS_REQUESTED";
break;
case FS_DOWNLOADING:
s = "FS_DOWNLOADING";
break;
default:
s = "unknown";
break;
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_REQUESTED:
s = "FS_REQUESTED";
break;
case FS_DOWNLOADING:
s = "FS_DOWNLOADING";
break;
default:
s = "unknown";
break;
}
I_Error("Try to load file \"%s\" with status of %d (%s)\n", fileneeded[i].filename,
fileneeded[i].status, s);
@ -1585,21 +1585,21 @@ void PT_FileFragment(SINT8 node, INT32 netconsole)
const char *s;
switch(file->status)
{
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_FOUND:
s = "FS_FOUND";
break;
case FS_OPEN:
s = "FS_OPEN";
break;
case FS_BADHASH:
s = "FS_BADHASH";
break;
default:
s = "unknown";
break;
case FS_NOTFOUND:
s = "FS_NOTFOUND";
break;
case FS_FOUND:
s = "FS_FOUND";
break;
case FS_OPEN:
s = "FS_OPEN";
break;
case FS_BADHASH:
s = "FS_BADHASH";
break;
default:
s = "unknown";
break;
}
I_Error("Received a file not requested (file id: %d, file status: %s)\n", filenum, s);
}

View file

@ -507,8 +507,10 @@ static void cleanupnodes(void)
// Why can't I start at zero?
for (j = 1; j < MAXNETNODES; j++)
{
if (!(nodeingame[j] || SendingFile(j)))
nodeconnected[j] = false;
}
}
static SINT8 getfreenode(void)
@ -518,11 +520,13 @@ static SINT8 getfreenode(void)
cleanupnodes();
for (j = 0; j < MAXNETNODES; j++)
{
if (!nodeconnected[j])
{
nodeconnected[j] = true;
return j;
}
}
/** \warning No free node? Just in case a node might not have been freed properly,
* look if there are connected nodes that aren't in game, and forget them.
@ -836,7 +840,7 @@ static void SOCK_Send(void)
static void SOCK_FreeNodenum(INT32 numnode)
{
// can't disconnect from self :)
if (!numnode || numnode > MAXNETNODES)
if (numnode <= 0 || numnode > MAXNETNODES)
return;
DEBFILE(va("Free node %d (%s)\n", numnode, SOCK_GetNodeAddress(numnode)));
@ -1462,14 +1466,12 @@ static void SOCK_RegisterHolePunch(void)
static boolean SOCK_OpenSocket(void)
{
size_t i;
memset(clientaddress, 0, sizeof (clientaddress));
memset(clientaddress, 0, sizeof(clientaddress));
memset(nodeconnected, false, sizeof(nodeconnected));
nodeconnected[0] = true; // always connected to self
for (i = 1; i < MAXNETNODES; i++)
nodeconnected[i] = false;
nodeconnected[BROADCASTADDR] = true;
I_NetSend = SOCK_Send;
I_NetGet = SOCK_Get;
I_NetCloseSocket = SOCK_CloseSocket;
@ -1519,7 +1521,7 @@ static boolean SOCK_Ban(INT32 node)
{
INT32 ban;
if (node > MAXNETNODES)
if (node < 0 || node > MAXNETNODES)
return false;
ban = numbans;