From ede46354a3dfdb20c9c4f87cb44ed1cf10763b9d Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 12 Jul 2026 13:51:50 +0200 Subject: [PATCH] bugfix(controlbar): Fix possible divisions by zero in ControlBar code. --- .../Source/GameClient/GUI/ControlBar/ControlBar.cpp | 6 ++---- .../GameClient/GUI/GUICallbacks/W3DControlBar.cpp | 8 +------- Generals/Code/GameEngine/Source/Common/RTS/Player.cpp | 10 ++++++++++ .../Code/GameEngine/Source/Common/RTS/Player.cpp | 10 ++++++++++ 4 files changed, 23 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..cc61946a925 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -2593,6 +2593,11 @@ 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 +2658,11 @@ 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 == 0) + m_levelUp = INT_MAX; + 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..5e748d746c3 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -2703,6 +2703,11 @@ 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 +2768,11 @@ 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 == 0) + m_levelUp = INT_MAX; + m_rankLevel = newLevel; DEBUG_ASSERTCRASH(m_skillPoints >= m_levelDown && m_skillPoints < m_levelUp, ("hmm, wrong"));