From 7262b0df4036595339d0fb2530577dc7ca49aa06 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 15 Feb 2026 01:31:51 +0100 Subject: [PATCH 1/3] bugfix(worldbuilder): Check list size before accessing first element in ObjectOptions::_FindOrDont. --- Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp | 2 +- GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp b/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp index 4c6a369f38d..13a7c13359c 100644 --- a/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp +++ b/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp @@ -402,7 +402,7 @@ HTREEITEM ObjectOptions::_FindOrDont(const char* pLabel, HTREEITEM startPoint) std::list itemsToEx; itemsToEx.push_back(startPoint); - while (itemsToEx.front()) { + while (!itemsToEx.empty()) { char buffer[_MAX_PATH]; HTREEITEM hItem = itemsToEx.front(); itemsToEx.pop_front(); diff --git a/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp b/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp index c15e1d3657d..7ad2e228cf8 100644 --- a/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp +++ b/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp @@ -402,7 +402,7 @@ HTREEITEM ObjectOptions::_FindOrDont(const char* pLabel, HTREEITEM startPoint) std::list itemsToEx; itemsToEx.push_back(startPoint); - while (itemsToEx.front()) { + while (!itemsToEx.empty()) { char buffer[_MAX_PATH]; HTREEITEM hItem = itemsToEx.front(); itemsToEx.pop_front(); From 2f5d827058a47d9d2c59bfe3366240a73018b4da Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sun, 15 Feb 2026 01:42:24 +0100 Subject: [PATCH 2/3] Changed loops. --- Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp | 2 +- GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp b/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp index 13a7c13359c..c99bf894b1d 100644 --- a/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp +++ b/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp @@ -402,7 +402,7 @@ HTREEITEM ObjectOptions::_FindOrDont(const char* pLabel, HTREEITEM startPoint) std::list itemsToEx; itemsToEx.push_back(startPoint); - while (!itemsToEx.empty()) { + while (!itemsToEx.empty() && itemsToEx.front()) { char buffer[_MAX_PATH]; HTREEITEM hItem = itemsToEx.front(); itemsToEx.pop_front(); diff --git a/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp b/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp index 7ad2e228cf8..bbf4b7ee7e7 100644 --- a/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp +++ b/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp @@ -402,7 +402,7 @@ HTREEITEM ObjectOptions::_FindOrDont(const char* pLabel, HTREEITEM startPoint) std::list itemsToEx; itemsToEx.push_back(startPoint); - while (!itemsToEx.empty()) { + while (!itemsToEx.empty() && itemsToEx.front()) { char buffer[_MAX_PATH]; HTREEITEM hItem = itemsToEx.front(); itemsToEx.pop_front(); From 77816602ba30e136138d7febcfb5c3e0c73ed0dd Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 17 Feb 2026 21:26:24 +0100 Subject: [PATCH 3/3] Changed nullptr check to assertion. --- Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp | 3 ++- GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp b/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp index c99bf894b1d..8ef7c88f13c 100644 --- a/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp +++ b/Generals/Code/Tools/WorldBuilder/src/ObjectOptions.cpp @@ -402,10 +402,11 @@ HTREEITEM ObjectOptions::_FindOrDont(const char* pLabel, HTREEITEM startPoint) std::list itemsToEx; itemsToEx.push_back(startPoint); - while (!itemsToEx.empty() && itemsToEx.front()) { + while (!itemsToEx.empty()) { char buffer[_MAX_PATH]; HTREEITEM hItem = itemsToEx.front(); itemsToEx.pop_front(); + DEBUG_ASSERTCRASH(hItem != nullptr, ("Unexpected tree item pointer in ObjectOptions::_FindOrDont")); if (!m_objectTreeView.ItemHasChildren(hItem)) { TVITEM item; diff --git a/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp b/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp index bbf4b7ee7e7..dcc8db44aa0 100644 --- a/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp +++ b/GeneralsMD/Code/Tools/WorldBuilder/src/ObjectOptions.cpp @@ -402,10 +402,11 @@ HTREEITEM ObjectOptions::_FindOrDont(const char* pLabel, HTREEITEM startPoint) std::list itemsToEx; itemsToEx.push_back(startPoint); - while (!itemsToEx.empty() && itemsToEx.front()) { + while (!itemsToEx.empty()) { char buffer[_MAX_PATH]; HTREEITEM hItem = itemsToEx.front(); itemsToEx.pop_front(); + DEBUG_ASSERTCRASH(hItem != nullptr, ("Unexpected tree item pointer in ObjectOptions::_FindOrDont")); if (!m_objectTreeView.ItemHasChildren(hItem)) { TVITEM item;