From 1380db037ae175c4ebb046278b08faaeaf3c94d9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 28 Jan 2019 18:58:02 +1100 Subject: [PATCH] fix UB caused by invalid GC id, set GC rank when changing gc if one isnt set - fixes #472 --- .../Network/Handlers/GMCommandHandlers.cpp | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index 1526789b..8468540c 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -399,13 +399,38 @@ void Sapphire::Network::GameConnection::gm1Handler( FrameworkPtr pFw, } case GmCommand::GC: { + if( param1 > 3 ) + { + player.sendUrgent( "Invalid Grand Company ID: {0}", param1 ); + return; + } + targetPlayer->setGc( param1 ); + + // if we're changing them to a GC, check if they have a rank and if not, set it to the lowest rank + if( param1 > 0 ) + { + auto gcRankIdx = static_cast< uint8_t >( param1 ) - 1; + if( targetPlayer->getGcRankArray()[ gcRankIdx ] == 0 ) + { + player.setGcRankAt( gcRankIdx, 1 ); + } + } + player.sendNotice( "GC for {0} was set to {1}", targetPlayer->getName(), targetPlayer->getGc() ); break; } case GmCommand::GCRank: { - targetPlayer->setGcRankAt( targetPlayer->getGc() - 1, param1 ); + auto gcId = targetPlayer->getGc() - 1; + + if( gcId > 2 ) + { + player.sendUrgent( "{0} has an invalid Grand Company ID: {0}", targetPlayer->getName(), gcId ); + return; + } + + targetPlayer->setGcRankAt( gcId, param1 ); player.sendNotice( "GC Rank for {0} for GC {1} was set to {2}", targetPlayer->getName(), targetPlayer->getGc(), targetPlayer->getGcRankArray()[ targetPlayer->getGc() - 1 ] ); break;