Network: Defer deletion of client and server game socket handler
This fixes various use after free scenarios in error handling paths
This commit is contained in:
@@ -663,6 +663,7 @@ void NetworkClose(bool close_admins)
|
||||
|
||||
_network_coordinator_client.CloseAllConnections();
|
||||
}
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
|
||||
TCPConnecter::KillAll();
|
||||
|
||||
@@ -1075,12 +1076,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) */
|
||||
@@ -1092,6 +1096,7 @@ static void NetworkSend()
|
||||
} else {
|
||||
ClientNetworkGameSocketHandler::Send();
|
||||
}
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1106,6 +1111,7 @@ void NetworkBackgroundLoop()
|
||||
TCPConnecter::CheckCallbacks();
|
||||
NetworkHTTPSocketHandler::HTTPReceive();
|
||||
QueryNetworkGameSocketHandler::SendReceive();
|
||||
NetworkGameSocketHandler::ProcessDeferredDeletions();
|
||||
|
||||
NetworkBackgroundUDPLoop();
|
||||
}
|
||||
|
Reference in New Issue
Block a user