diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 50f7befde6a..5d854bfec5e 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -1247,7 +1247,13 @@ void ServerLobby::liveJoinRequest(Event* event) if (!spectator) { auto spectators_by_limit = getSpectatorsByLimit(); - setPlayerKarts(data, peer); + if (!setPlayerKarts(data, peer)) + { + // The kart list is part of the live-join request. Do not continue + // with uninitialised kart data after rejecting a malformed list. + rejectLiveJoin(peer, BLR_NONE); + return; + } std::vector used_id; for (unsigned i = 0; i < peer->getPlayerProfiles().size(); i++) @@ -4167,9 +4173,15 @@ void ServerLobby::addLiveJoinPlaceholder( } // addLiveJoinPlaceholder //----------------------------------------------------------------------------- -void ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const +bool ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const { unsigned player_count = ns.getUInt8(); + if (player_count > peer->getPlayerProfiles().size()) + { + Log::warn("ServerLobby", "Too many kart entries from %s.", + peer->getAddress().toString().c_str()); + return false; + } for (unsigned i = 0; i < player_count; i++) { std::string kart; @@ -4192,7 +4204,7 @@ void ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const } if (peer->getClientCapabilities().find("real_addon_karts") == peer->getClientCapabilities().end() || ns.size() == 0) - return; + return true; for (unsigned i = 0; i < player_count; i++) { KartData kart_data(ns); @@ -4219,6 +4231,7 @@ void ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const player->setKartData(kart_data); } } + return true; } // setPlayerKarts //----------------------------------------------------------------------------- diff --git a/src/network/protocols/server_lobby.hpp b/src/network/protocols/server_lobby.hpp index bbb6ed8ad59..f838fb0f56c 100644 --- a/src/network/protocols/server_lobby.hpp +++ b/src/network/protocols/server_lobby.hpp @@ -270,7 +270,7 @@ class ServerLobby : public LobbyProtocol void encodePlayers(BareNetworkString* bns, std::vector >& players) const; std::vector > getLivePlayers() const; - void setPlayerKarts(const NetworkString& ns, STKPeer* peer) const; + bool setPlayerKarts(const NetworkString& ns, STKPeer* peer) const; bool handleAssets(const NetworkString& ns, STKPeer* peer); void liveJoinRequest(Event* event); void rejectLiveJoin(STKPeer* peer, BackLobbyReason blr);