wesnothd: Fix server crash if client is autokicked by registered login

This commit is contained in:
loonycyborg 2021-10-27 16:40:20 +03:00
parent 71422ead8e
commit 8cdf83393e
2 changed files with 7 additions and 3 deletions

View file

@ -754,7 +754,7 @@ void server::login_client(boost::asio::yield_context yield, SocketPtr socket)
if(const simple_wml::node* const login = login_response->child("login")) {
username = (*login)["username"].to_string();
if(is_login_allowed(socket, login, username, registered, is_moderator)) {
if(is_login_allowed(yield, socket, login, username, registered, is_moderator)) {
break;
} else continue;
}
@ -813,7 +813,7 @@ void server::login_client(boost::asio::yield_context yield, SocketPtr socket)
}
}
template<class SocketPtr> bool server::is_login_allowed(SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator)
template<class SocketPtr> bool server::is_login_allowed(boost::asio::yield_context yield, SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator)
{
// Check if the username is valid (all alpha-numeric plus underscore and hyphen)
if(!utils::isvalid_username(username)) {
@ -920,6 +920,10 @@ template<class SocketPtr> bool server::is_login_allowed(SocketPtr socket, const
if(registered) {
// If there is already a client using this username kick it
process_command("kick " + p->info().name() + " autokick by registered user", username);
// need to wait for it to process
while(player_connections_.get<name_t>().count(p->info().name()) > 0) {
boost::asio::post(yield);
}
} else {
async_send_error(socket, "The nickname '" + username + "' is already taken.", MP_NAME_TAKEN_ERROR);
return false;

View file

@ -49,7 +49,7 @@ private:
void handle_new_client(tls_socket_ptr socket);
template<class SocketPtr> void login_client(boost::asio::yield_context yield, SocketPtr socket);
template<class SocketPtr> bool is_login_allowed(SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator);
template<class SocketPtr> bool is_login_allowed(boost::asio::yield_context yield, SocketPtr socket, const simple_wml::node* const login, const std::string& username, bool& registered, bool& is_moderator);
template<class SocketPtr> bool authenticate(SocketPtr socket, const std::string& username, const std::string& password, bool name_taken, bool& registered);
template<class SocketPtr> void send_password_request(SocketPtr socket, const std::string& msg, const char* error_code = "", bool force_confirmation = false);
bool accepting_connections() const { return !graceful_restart; }