Skip to content

Commit 5794d5c

Browse files
authored
Merge pull request #472 from GeneralsOnlineDevelopmentTeam/seer/bugfix/overridable-dangling-pointer
bugfix(overridable): Prevent dangling pointer after removing override chain
2 parents b4df76c + 486c1b4 commit 5794d5c

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

Generals/Code/GameEngine/Include/Common/Overridable.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@ class Overridable : public MemoryPoolObject
105105
{
106106
if ( m_isOverride )
107107
{
108+
// TheSuperHackers @bugfix Clean up the override chain before deleting this node.
109+
// Without this, deleteInstance(this) triggers ~Overridable() which deletes m_nextOverride
110+
// via the destructor, but the caller may still hold a pointer to the now-freed chain,
111+
// creating a dangling pointer that causes an access violation in getFinalOverride().
112+
if ( m_nextOverride )
113+
{
114+
m_nextOverride->deleteOverrides();
115+
m_nextOverride = nullptr;
116+
}
108117
deleteInstance(this);
109118
return nullptr;
110119
}

GeneralsMD/Code/GameEngine/Include/Common/Overridable.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,15 @@ class Overridable : public MemoryPoolObject
105105
{
106106
if ( m_isOverride )
107107
{
108+
// TheSuperHackers @bugfix Clean up the override chain before deleting this node.
109+
// Without this, deleteInstance(this) triggers ~Overridable() which deletes m_nextOverride
110+
// via the destructor, but the caller may still hold a pointer to the now-freed chain,
111+
// creating a dangling pointer that causes an access violation in getFinalOverride().
112+
if ( m_nextOverride )
113+
{
114+
m_nextOverride->deleteOverrides();
115+
m_nextOverride = nullptr;
116+
}
108117
deleteInstance(this);
109118
return nullptr;
110119
}

0 commit comments

Comments
 (0)