From c8c0c761c2ee34ec0a63ccb9a99d7bc1c6089780 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Wed, 15 Jul 2026 23:50:42 +0200 Subject: [PATCH] bugfix(controlbar): Fix possible divisions by zero in Control Bar code. --- .../GameClient/GUI/ControlBar/ControlBar.cpp | 6 ++---- .../GameClient/GUI/GUICallbacks/W3DControlBar.cpp | 8 +------- .../Code/GameEngine/Source/Common/RTS/Player.cpp | 15 +++++++++++++++ .../Code/GameEngine/Source/Common/RTS/Player.cpp | 15 +++++++++++++++ 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp b/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp index 2c90a3d80d2..c7d6c2068fc 100644 --- a/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp +++ b/Core/GameEngine/Source/GameClient/GUI/ControlBar/ControlBar.cpp @@ -424,8 +424,7 @@ void ControlBar::populatePurchaseScience( Player* player ) win = TheWindowManager->winGetWindowFromId( m_contextParent[ CP_PURCHASE_SCIENCE ], TheNameKeyGenerator->nameToKey( "GeneralsExpPoints.wnd:ProgressBarExperience" ) ); if(win) { - Int progress; - progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) /(player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); + const Int progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / (player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); GadgetProgressBarSetProgress(win, progress); } @@ -483,8 +482,7 @@ void ControlBar::updateContextPurchaseScience() win = TheWindowManager->winGetWindowFromId( m_contextParent[ CP_PURCHASE_SCIENCE ], TheNameKeyGenerator->nameToKey( "GeneralsExpPoints.wnd:ProgressBarExperience" ) ); if(win) { - Int progress; - progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) /(player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); + const Int progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / (player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); GadgetProgressBarSetProgress(win, progress); } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp index 3310b688c5c..6f12ef22326 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/GUI/GUICallbacks/W3DControlBar.cpp @@ -477,14 +477,8 @@ void W3DCommandBarGenExpDraw( GameWindow *window, WinInstanceData *instData ) static const Image *endBar = TheMappedImageCollection->findImageByName("GenExpBarTop1"); static const Image *beginBar = TheMappedImageCollection->findImageByName("GenExpBarBottom1"); static const Image *centerBar = TheMappedImageCollection->findImageByName("GenExpBar1"); - Int progress = 0; - Int skillPointsRequired = player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown(); - // TheSuperHackers @bugfix Mauller 04/05/2025 Prevent possible division by zero - if ( skillPointsRequired > 0) - { - progress = ( ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / skillPointsRequired ); - } + Int progress = ((player->getSkillPoints() - player->getSkillPointsLevelDown()) * 100) / (player->getSkillPointsLevelUp() - player->getSkillPointsLevelDown()); if(progress <= 0) return; diff --git a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp index 0024c0c95cc..a2598a231bc 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -2593,6 +2593,13 @@ void Player::resetRank() m_skillPoints = 0; const RankInfo* nextRank = TheRankInfoStore->getRankInfo(m_rankLevel+1); m_levelUp = nextRank ? nextRank->m_skillPointsNeeded : INT_MAX; + + // TheSuperHackers @bugfix Prevent possible division by zero in the control bar code. + if (m_levelUp == 0) + { + m_levelUp = INT_MAX; + } + m_levelDown = 0; m_sciences.clear(); m_sciencePurchasePoints = getPlayerTemplate() ? getPlayerTemplate()->getIntrinsicSciencePurchasePoints() : 0; @@ -2653,6 +2660,14 @@ Bool Player::setRankLevel(Int newLevel) const RankInfo* nextRank = TheRankInfoStore->getRankInfo(newLevel + 1); m_levelUp = nextRank ? nextRank->m_skillPointsNeeded : INT_MAX; + + // TheSuperHackers @bugfix Prevent possible division by zero in the control bar code. + if (m_levelUp - m_levelDown == 0) + { + m_levelUp = INT_MAX; + m_levelDown = 0; + } + m_rankLevel = newLevel; DEBUG_ASSERTCRASH(m_skillPoints >= m_levelDown && m_skillPoints < m_levelUp, ("hmm, wrong")); diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp index 8286128c090..be5e060b0a4 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -2703,6 +2703,13 @@ void Player::resetRank() m_skillPoints = 0; const RankInfo* nextRank = TheRankInfoStore->getRankInfo(m_rankLevel+1); m_levelUp = nextRank ? nextRank->m_skillPointsNeeded : INT_MAX; + + // TheSuperHackers @bugfix Prevent possible division by zero in the control bar code. + if (m_levelUp == 0) + { + m_levelUp = INT_MAX; + } + m_levelDown = 0; m_sciences.clear(); m_sciencePurchasePoints = getPlayerTemplate() ? getPlayerTemplate()->getIntrinsicSciencePurchasePoints() : 0; @@ -2763,6 +2770,14 @@ Bool Player::setRankLevel(Int newLevel) const RankInfo* nextRank = TheRankInfoStore->getRankInfo(newLevel + 1); m_levelUp = nextRank ? nextRank->m_skillPointsNeeded : INT_MAX; + + // TheSuperHackers @bugfix Prevent possible division by zero in the control bar code. + if (m_levelUp - m_levelDown == 0) + { + m_levelUp = INT_MAX; + m_levelDown = 0; + } + m_rankLevel = newLevel; DEBUG_ASSERTCRASH(m_skillPoints >= m_levelDown && m_skillPoints < m_levelUp, ("hmm, wrong"));