From d8cada7563228809936c0a2b21c5c098848636eb Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 11 Feb 2011 23:20:35 +0000 Subject: (svn r22064) -Fix [FS#4497] (r21399): crash when disconnecting and reconnecting while the server is still saving the savegame --- src/network/network_server.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/network/network_server.cpp') diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index be27d75a6..ffd295008 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -69,7 +69,6 @@ struct PacketWriter : SaveFilter { /** Make sure everything is cleaned up. */ ~PacketWriter() { - /* Prevent double frees. */ if (this->cs != NULL) { if (this->cs->savegame_mutex != NULL) this->cs->savegame_mutex->BeginCritical(); @@ -99,7 +98,8 @@ struct PacketWriter : SaveFilter { /* virtual */ void Write(byte *buf, size_t size) { - if (this->cs == NULL) return; + /* We want to abort the saving when the socket is closed. */ + if (this->cs == NULL) SlError(STR_NETWORK_ERROR_LOSTCONNECTION); if (this->current == NULL) this->current = new Packet(PACKET_SERVER_MAP_DATA); @@ -125,7 +125,8 @@ struct PacketWriter : SaveFilter { /* virtual */ void Finish() { - if (this->cs == NULL) return; + /* We want to abort the saving when the socket is closed. */ + if (this->cs == NULL) SlError(STR_NETWORK_ERROR_LOSTCONNECTION); if (this->cs->savegame_mutex != NULL) this->cs->savegame_mutex->BeginCritical(); @@ -181,6 +182,10 @@ ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler() if (this->savegame != NULL) this->savegame->cs = NULL; if (this->savegame_mutex != NULL) this->savegame_mutex->EndCritical(); + + /* Make sure the saving is completely cancelled. */ + if (this->savegame != NULL) WaitTillSaved(); + delete this->savegame_mutex; } -- cgit v1.2.3-54-g00ecf