summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-01-02 20:34:55 +0100
committerGitHub <noreply@github.com>2021-01-02 20:34:55 +0100
commitc288eba81389d07e27b32f28c6dc4dc518824d2b (patch)
treedc7eddb7a1078e780980adac8b1fa96da5b87b6f /src/network
parent46e13e7f0b5b52ad8cf75b42bbf41438adf0f0da (diff)
downloadopenttd-c288eba81389d07e27b32f28c6dc4dc518824d2b.tar.xz
Fix: prevent clients making emergency saves twice if server disconnects (#8477)
This was clearly overlooked during the initial implementation.
Diffstat (limited to 'src/network')
-rw-r--r--src/network/network_client.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp
index a66786dad..e083e6c1a 100644
--- a/src/network/network_client.cpp
+++ b/src/network/network_client.cpp
@@ -211,15 +211,22 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res)
default: errorno = NETWORK_ERROR_GENERAL; break;
}
- /* This means we fucked up and the server closed the connection */
- if (res != NETWORK_RECV_STATUS_SERVER_ERROR && res != NETWORK_RECV_STATUS_SERVER_FULL &&
- res != NETWORK_RECV_STATUS_SERVER_BANNED) {
+ if (res == NETWORK_RECV_STATUS_SERVER_ERROR || res == NETWORK_RECV_STATUS_SERVER_FULL ||
+ res == NETWORK_RECV_STATUS_SERVER_BANNED) {
+ /* This means the server closed the connection. Emergency save is
+ * already created if this was appropriate during handling of the
+ * disconnect. */
+ this->CloseConnection(res);
+ } else {
+ /* This means we as client made a boo-boo. */
SendError(errorno);
- }
- this->CloseConnection(res);
-
- ClientNetworkEmergencySave();
+ /* Close connection before we make an emergency save, as the save can
+ * take a bit of time; better that the server doesn't stall while we
+ * are doing the save, and already disconnects us. */
+ this->CloseConnection(res);
+ ClientNetworkEmergencySave();
+ }
_switch_mode = SM_MENU;
_networking = false;