From 6f2f23a6352d2cf64b8227b89ee5fe7d582285c5 Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 16:26:04 +0000 Subject: [PATCH] MessageStream: Add null checks for ThePlayerList and local player before accessing player index --- .../Code/GameEngine/Source/Common/MessageStream.cpp | 13 ++++++++++++- .../Code/GameEngine/Source/Common/MessageStream.cpp | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Source/Common/MessageStream.cpp b/Generals/Code/GameEngine/Source/Common/MessageStream.cpp index a4eea8cb1d2..43fc18f615b 100644 --- a/Generals/Code/GameEngine/Source/Common/MessageStream.cpp +++ b/Generals/Code/GameEngine/Source/Common/MessageStream.cpp @@ -54,7 +54,18 @@ CommandList *TheCommandList = NULL; */ GameMessage::GameMessage( GameMessage::Type type ) { - m_playerIndex = ThePlayerList->getLocalPlayer()->getPlayerIndex(); + // Defensive programming: Check if ThePlayerList is initialized before dereferencing + // This prevents crashes during early initialization or shutdown when Windows messages + // can arrive before the game state is fully ready + if (ThePlayerList != NULL && ThePlayerList->getLocalPlayer() != NULL) + { + m_playerIndex = ThePlayerList->getLocalPlayer()->getPlayerIndex(); + } + else + { + // Use neutral player index (0) as a safe default when ThePlayerList is not yet initialized + m_playerIndex = 0; + } m_type = type; m_argList = NULL; m_argTail = NULL; diff --git a/GeneralsMD/Code/GameEngine/Source/Common/MessageStream.cpp b/GeneralsMD/Code/GameEngine/Source/Common/MessageStream.cpp index 4f0fdf775f6..317f9e521a8 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/MessageStream.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/MessageStream.cpp @@ -54,7 +54,18 @@ CommandList* TheCommandList = NULL; */ GameMessage::GameMessage(GameMessage::Type type) { - m_playerIndex = ThePlayerList->getLocalPlayer()->getPlayerIndex(); + // Defensive programming: Check if ThePlayerList is initialized before dereferencing + // This prevents crashes during early initialization or shutdown when Windows messages + // can arrive before the game state is fully ready + if (ThePlayerList != NULL && ThePlayerList->getLocalPlayer() != NULL) + { + m_playerIndex = ThePlayerList->getLocalPlayer()->getPlayerIndex(); + } + else + { + // Use neutral player index (0) as a safe default when ThePlayerList is not yet initialized + m_playerIndex = 0; + } m_type = type; m_argList = NULL; m_argTail = NULL;