mirror of https://github.com/OpenTTD/OpenTTD
(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.
parent
df75db67eb
commit
59ec3dc267
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue