Fix #11016: Defer deletion of client and server game socket handlers
This fixes various use after free scenarios in error handling paths
This commit is contained in:

committed by
PeterN

parent
19ae88fb63
commit
4f6d75f97d
@@ -595,6 +595,7 @@ void NetworkClose(bool close_admins)
|
||||
|
||||
_network_coordinator_client.CloseAllConnections();
|
||||
}
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
|
||||
TCPConnecter::KillAll();
|
||||
|
||||
@@ -992,12 +993,15 @@ void NetworkUpdateServerGameType()
|
||||
*/
|
||||
static bool NetworkReceive()
|
||||
{
|
||||
bool result;
|
||||
if (_network_server) {
|
||||
ServerNetworkAdminSocketHandler::Receive();
|
||||
return ServerNetworkGameSocketHandler::Receive();
|
||||
result = ServerNetworkGameSocketHandler::Receive();
|
||||
} else {
|
||||
return ClientNetworkGameSocketHandler::Receive();
|
||||
result = ClientNetworkGameSocketHandler::Receive();
|
||||
}
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
return result;
|
||||
}
|
||||
|
||||
/* This sends all buffered commands (if possible) */
|
||||
@@ -1009,6 +1013,7 @@ static void NetworkSend()
|
||||
} else {
|
||||
ClientNetworkGameSocketHandler::Send();
|
||||
}
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1023,6 +1028,7 @@ void NetworkBackgroundLoop()
|
||||
TCPConnecter::CheckCallbacks();
|
||||
NetworkHTTPSocketHandler::HTTPReceive();
|
||||
QueryNetworkGameSocketHandler::SendReceive();
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
|
||||
NetworkBackgroundUDPLoop();
|
||||
}
|
||||
|
Reference in New Issue
Block a user