From b030c1710cf3ffaa96b986d84c78668b809c55d1 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Mon, 26 May 2025 19:28:35 +0200 Subject: [PATCH 1/2] [GEN][ZH] Fix using uninitialized memory 'mask' in getHumanPlayerMask() --- .../Source/GameLogic/ScriptEngine/ScriptActions.cpp | 4 ++-- .../Source/GameLogic/ScriptEngine/ScriptActions.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp b/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp index e07e6bc95b..3addd69b30 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp @@ -2897,12 +2897,12 @@ void ScriptActions::doCameraMotionBlur(Bool zoomIn, Bool saturate) static PlayerMaskType getHumanPlayerMask( void ) { - PlayerMaskType mask; + PlayerMaskType mask = 0; for (Int i=0; igetPlayerCount(); ++i) { const Player *player = ThePlayerList->getNthPlayer(i); if (player->getPlayerType() == PLAYER_HUMAN) - mask &= player->getPlayerMask(); + mask |= player->getPlayerMask(); } //DEBUG_LOG(("getHumanPlayerMask(): mask was %4.4X\n", mask)); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp index b91f81e880..e7578a75bc 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp @@ -2993,12 +2993,12 @@ void ScriptActions::doCameraMotionBlur(Bool zoomIn, Bool saturate) static PlayerMaskType getHumanPlayerMask( void ) { - PlayerMaskType mask; + PlayerMaskType mask = 0; for (Int i=0; igetPlayerCount(); ++i) { const Player *player = ThePlayerList->getNthPlayer(i); if (player->getPlayerType() == PLAYER_HUMAN) - mask &= player->getPlayerMask(); + mask |= player->getPlayerMask(); } //DEBUG_LOG(("getHumanPlayerMask(): mask was %4.4X\n", mask)); From 24eb628d511c1f1483869552b83de34f3907acea Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Fri, 20 Jun 2025 08:11:59 +0200 Subject: [PATCH 2/2] But the fix behind !RETAIL_COMPATIBLE_CRC --- .../Source/GameLogic/ScriptEngine/ScriptActions.cpp | 8 ++++++++ .../Source/GameLogic/ScriptEngine/ScriptActions.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp b/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp index 3addd69b30..a733636c06 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp @@ -2897,12 +2897,20 @@ void ScriptActions::doCameraMotionBlur(Bool zoomIn, Bool saturate) static PlayerMaskType getHumanPlayerMask( void ) { +#if RETAIL_COMPATIBLE_CRC + PlayerMaskType mask; +#else PlayerMaskType mask = 0; +#endif for (Int i=0; igetPlayerCount(); ++i) { const Player *player = ThePlayerList->getNthPlayer(i); if (player->getPlayerType() == PLAYER_HUMAN) +#if RETAIL_COMPATIBLE_CRC + mask &= player->getPlayerMask(); +#else mask |= player->getPlayerMask(); +#endif } //DEBUG_LOG(("getHumanPlayerMask(): mask was %4.4X\n", mask)); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp index e7578a75bc..a553b23b26 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptActions.cpp @@ -2993,12 +2993,20 @@ void ScriptActions::doCameraMotionBlur(Bool zoomIn, Bool saturate) static PlayerMaskType getHumanPlayerMask( void ) { +#if RETAIL_COMPATIBLE_CRC + PlayerMaskType mask; +#else PlayerMaskType mask = 0; +#endif for (Int i=0; igetPlayerCount(); ++i) { const Player *player = ThePlayerList->getNthPlayer(i); if (player->getPlayerType() == PLAYER_HUMAN) +#if RETAIL_COMPATIBLE_CRC + mask &= player->getPlayerMask(); +#else mask |= player->getPlayerMask(); +#endif } //DEBUG_LOG(("getHumanPlayerMask(): mask was %4.4X\n", mask));