From d5154f0a5da5971df3a3ab4ea1d499f2bd4cafda Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Tue, 4 Oct 2022 23:42:49 -0700 Subject: [PATCH] close proxy session early if client intentionally disconnects --- src/ProxyCommands.cc | 9 ++++++++- src/ProxyServer.cc | 4 ++++ src/ProxyServer.hh | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ProxyCommands.cc b/src/ProxyCommands.cc index 977f2a14..de9f9c5a 100644 --- a/src/ProxyCommands.cc +++ b/src/ProxyCommands.cc @@ -114,6 +114,12 @@ static HandlerResult S_invalid(shared_ptr, return HandlerResult::Type::SUPPRESS; } +static HandlerResult C_05(shared_ptr, + ProxyServer::LinkedSession& session, uint16_t, uint32_t, string&) { + session.close_on_disconnect = true; + return HandlerResult::Type::FORWARD; +} + static HandlerResult S_97(shared_ptr, ProxyServer::LinkedSession& session, uint16_t, uint32_t flag, string&) { // If the client has already received a 97 command, block this one and @@ -1303,6 +1309,7 @@ static HandlerResult C_V123_A0_A1(shared_ptr, // For licensed sessions, send them back to newserv's main menu instead of // going to the remote server's ship/block select menu session.send_to_game_server(); + session.close_on_disconnect = true; return HandlerResult::Type::SUPPRESS; } @@ -1316,7 +1323,7 @@ static on_command_t handlers[0x100][6][2] = { /* 02 */ {{S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {S_V123P_02_17, nullptr}, {nullptr, nullptr}}, /* 03 */ {{S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {S_B_03, nullptr}}, /* 04 */ {{nullptr, nullptr}, {S_V123_04, nullptr}, {S_V123_04, nullptr}, {S_V123_04, nullptr}, {S_V123_04, nullptr}, {nullptr, nullptr}}, -/* 05 */ {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}}, +/* 05 */ {{nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}, {nullptr, C_05}}, /* 06 */ {{nullptr, nullptr}, {S_V123_06, C_06}, {S_V123_06, C_06}, {S_V123_06, C_06}, {S_V123_06, C_06}, {nullptr, C_06}}, /* 07 */ {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}}, /* 08 */ {{nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}}, diff --git a/src/ProxyServer.cc b/src/ProxyServer.cc index 389303ab..73bef8d3 100644 --- a/src/ProxyServer.cc +++ b/src/ProxyServer.cc @@ -469,6 +469,7 @@ ProxyServer::LinkedSession::LinkedSession( TerminalFormat::FG_YELLOW, TerminalFormat::FG_RED), local_port(local_port), + close_on_disconnect(false), remote_ip_crc(0), enable_remote_ip_crc_patch(false), version(version), @@ -660,6 +661,9 @@ void ProxyServer::LinkedSession::on_error(Channel& ch, short events) { session->send_to_game_server("The server has\ndisconnected."); } session->disconnect(); + if (session->close_on_disconnect) { + session->server->delete_session(session->id); + } } } diff --git a/src/ProxyServer.hh b/src/ProxyServer.hh index c2275627..2b7ee125 100644 --- a/src/ProxyServer.hh +++ b/src/ProxyServer.hh @@ -45,6 +45,7 @@ public: Channel server_channel; uint16_t local_port; struct sockaddr_storage next_destination; + bool close_on_disconnect; uint8_t prev_server_command_bytes[6]; uint32_t remote_ip_crc;