diff --git a/src/TNetwork.cpp b/src/TNetwork.cpp index b6bb27f8..02fb55b4 100644 --- a/src/TNetwork.cpp +++ b/src/TNetwork.cpp @@ -670,7 +670,13 @@ void TNetwork::TCPClient(const std::weak_ptr& c) { Client->Disconnect("TCPRcv failed"); break; } - mServer.GlobalParser(c, std::move(res), mPPSMonitor, *this, false); + try { + mServer.GlobalParser(c, std::move(res), mPPSMonitor, *this, false); + } catch (const std::exception& e) { + beammp_warnf("Failed to receive/parse packet via TCP from client {}: {}", Client->GetID(), e.what()); + Client->Disconnect("Failed to parse packet"); + break; + } } if (QueueSync.joinable()) diff --git a/src/TServer.cpp b/src/TServer.cpp index 26188402..587cef67 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -53,7 +54,6 @@ static std::optional> GetPidVid(const std::string& str) { } return std::nullopt; } - TEST_CASE("GetPidVid") { SUBCASE("Valid singledigit") { const auto MaybePidVid = GetPidVid("0-1"); @@ -120,7 +120,6 @@ TEST_CASE("GetPidVid") { CHECK(!MaybePidVid); } } - TServer::TServer(const std::vector& Arguments) { beammp_info("BeamMP Server v" + Application::ServerVersionString()); Application::SetSubsystemStatus("Server", Application::Status::Starting); @@ -472,7 +471,13 @@ void TServer::ParseVehicle(TClient& c, const std::string& Pckt, TNetwork& Networ } if (PID != -1 && VID != -1 && PID == c.GetID()) { - Data = Data.substr(Data.find('{')); + auto BracketPos = Data.find('{'); + if (BracketPos == std::string::npos) { + beammp_debugf("Invalid 'Or' packet body from client {}", c.GetID()); + return; + } + + Data = Data.substr(BracketPos); LuaAPI::MP::Engine->ReportErrors(LuaAPI::MP::Engine->TriggerEvent("onVehicleReset", "", c.GetID(), VID, Data)); Network.SendToAll(&c, StringToVector(Packet), false, true); } @@ -501,7 +506,14 @@ void TServer::ParseVehicle(TClient& c, const std::string& Pckt, TNetwork& Networ } if (PID != -1 && VID != -1 && PID == c.GetID()) { - Data = Data.substr(Data.find('[')); + auto BracketPos = Data.find('['); + if (BracketPos == std::string::npos) { + beammp_debugf("Invalid 'Op' packet body from client {}", c.GetID()); + return; + } + + Data = Data.substr(BracketPos); + LuaAPI::MP::Engine->ReportErrors(LuaAPI::MP::Engine->TriggerEvent("onVehiclePaintChanged", "", c.GetID(), VID, Data)); Network.SendToAll(&c, StringToVector(Packet), false, true);