From cb060f43b5dc04a3a892506fb81eb5cc76d648a8 Mon Sep 17 00:00:00 2001 From: Zach H Date: Sun, 9 Feb 2025 17:11:00 -0500 Subject: [PATCH] Prevent server crash if DB is down and game is attempted to be created (#5600) --- common/server_protocolhandler.cpp | 8 ++++--- .../src/servatrice_database_interface.cpp | 22 ++++++++++--------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 00c3d89b4..045b84487 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -790,9 +790,6 @@ Server_ProtocolHandler::cmdCreateGame(const Command_CreateGame &cmd, Server_Room { if (authState == NotLoggedIn) return Response::RespLoginNeeded; - const int gameId = databaseInterface->getNextGameId(); - if (gameId == -1) - return Response::RespInternalError; if (cmd.password().length() > MAX_NAME_LENGTH) return Response::RespContextError; @@ -821,6 +818,11 @@ Server_ProtocolHandler::cmdCreateGame(const Command_CreateGame &cmd, Server_Room QString description = nameFromStdString(cmd.description()); int startingLifeTotal = cmd.has_starting_life_total() ? cmd.starting_life_total() : 20; + const int gameId = databaseInterface->getNextGameId(); + if (gameId == -1) { + return Response::RespInternalError; + } + // When server doesn't permit registered users to exist, do not honor only-reg setting bool onlyRegisteredUsers = cmd.only_registered() && (server->permitUnregisteredUsers()); Server_Game *game = new Server_Game( diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index bff05293a..2a8b9d675 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -709,7 +709,9 @@ bool Servatrice_DatabaseInterface::userSessionExists(const QString &userName) "select 1 from {prefix}_sessions where user_name = :user_name and id_server = :id_server and end_time is null"); query->bindValue(":id_server", server->getServerID()); query->bindValue(":user_name", userName); - execSqlQuery(query); + if (!execSqlQuery(query)) { + return false; + }; return query->next(); } @@ -745,15 +747,9 @@ void Servatrice_DatabaseInterface::endSession(qint64 sessionId) if (!checkSql()) return; - QSqlQuery *query = prepareQuery("lock tables {prefix}_sessions write"); - execSqlQuery(query); - - query = prepareQuery("update {prefix}_sessions set end_time=NOW() where id = :id_session"); + auto *query = prepareQuery("update {prefix}_sessions set end_time=NOW() where id = :id_session"); query->bindValue(":id_session", sessionId); execSqlQuery(query); - - query = prepareQuery("unlock tables"); - execSqlQuery(query); } QMap Servatrice_DatabaseInterface::getBuddyList(const QString &name) @@ -811,7 +807,10 @@ int Servatrice_DatabaseInterface::getNextGameId() return -1; QSqlQuery *query = prepareQuery("insert into {prefix}_games (time_started) values (now())"); - execSqlQuery(query); + + if (!execSqlQuery(query)) { + return -1; + } return query->lastInsertId().toInt(); } @@ -822,7 +821,10 @@ int Servatrice_DatabaseInterface::getNextReplayId() return -1; QSqlQuery *query = prepareQuery("insert into {prefix}_replays (id_game) values (NULL)"); - execSqlQuery(query); + + if (!execSqlQuery(query)) { + return -1; + } return query->lastInsertId().toInt(); }