1
0
Fork 0

(svn r17743) -Fix: (post 0.7) memory leak in server in case handling a packet caused the connection to be closed. Also force-close the connection on invalid packets.

release/1.0
rubidium 2009-10-07 21:11:56 +00:00
parent df75db67eb
commit 59ec3dc267
1 changed files with 6 additions and 5 deletions

View File

@ -1566,17 +1566,18 @@ bool NetworkServerChangeClientName(ClientID client_id, const char *new_name)
void NetworkServer_ReadPackets(NetworkClientSocket *cs) void NetworkServer_ReadPackets(NetworkClientSocket *cs)
{ {
Packet *p; Packet *p;
NetworkRecvStatus res; NetworkRecvStatus res = NETWORK_RECV_STATUS_OKAY;
while ((p = cs->Recv_Packet()) != NULL) {
while (res == NETWORK_RECV_STATUS_OKAY && (p = cs->Recv_Packet()) != NULL) {
byte type = p->Recv_uint8(); byte type = p->Recv_uint8();
if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->HasClientQuit()) { if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->HasClientQuit()) {
res = _network_server_packet[type](cs, p); res = _network_server_packet[type](cs, p);
/* Something didn't go as expected */
if (res != NETWORK_RECV_STATUS_OKAY) return;
} else { } else {
cs->CloseConnection();
res = NETWORK_RECV_STATUS_MALFORMED_PACKET;
DEBUG(net, 0, "[server] received invalid packet type %d", type); DEBUG(net, 0, "[server] received invalid packet type %d", type);
} }
delete p; delete p;
} }
} }