From 24a627cbc19e2a003cb7040c2579264bb0895751 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Tue, 31 Jan 2023 20:17:46 +0200 Subject: [PATCH] Guard against possible illegal array access (by Seven) ClosestPanicTrigger() can return -1 but its use in indexing gTacticalStatus.bPanicTriggerIsAlarm was not checked in all the places in the code --- Tactical/Soldier Ani.cpp | 10 +++++----- Tactical/Soldier Control.cpp | 12 +++++++----- TacticalAI/DecideAction.cpp | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Tactical/Soldier Ani.cpp b/Tactical/Soldier Ani.cpp index 1e83d2cb8..e60f7bec2 100644 --- a/Tactical/Soldier Ani.cpp +++ b/Tactical/Soldier Ani.cpp @@ -3206,14 +3206,14 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier ) case 762: { // CODE: Set off Trigger - INT8 bPanicTrigger; - - bPanicTrigger = ClosestPanicTrigger( pSoldier ); - SetOffPanicBombs( pSoldier->ubID, bPanicTrigger ); + INT8 bPanicTrigger = ClosestPanicTrigger( pSoldier ); + if (bPanicTrigger != -1) + { + SetOffPanicBombs( pSoldier->ubID, bPanicTrigger ); + } // any AI guy has been specially given keys for this, now take them // away pSoldier->flags.bHasKeys = pSoldier->flags.bHasKeys >> 1; - } break; diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index a5712d7bf..51fb72787 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -21916,13 +21916,15 @@ void SoldierCollapse( SOLDIERTYPE *pSoldier ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_ENEMY ) { - // sevenfm: bPanicTriggerIsAlarm is always not NULL pointer - //if ( !(gTacticalStatus.bPanicTriggerIsAlarm) && (gTacticalStatus.ubTheChosenOne == pSoldier->ubID) ) if ( gTacticalStatus.ubTheChosenOne == pSoldier->ubID ) { - // replace this guy as the chosen one! - gTacticalStatus.ubTheChosenOne = NOBODY; - MakeClosestEnemyChosenOne( ); + auto bPanicTrigger = ClosestPanicTrigger(pSoldier); + if (bPanicTrigger != -1 && !(gTacticalStatus.bPanicTriggerIsAlarm[bPanicTrigger])) + { + // replace this guy as the chosen one! + gTacticalStatus.ubTheChosenOne = NOBODY; + MakeClosestEnemyChosenOne( ); + } } if ( (gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT) && (pSoldier->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL) ) diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp index e426c3732..eb421ce88 100644 --- a/TacticalAI/DecideAction.cpp +++ b/TacticalAI/DecideAction.cpp @@ -4974,7 +4974,7 @@ INT16 ubMinAPCost; bPanicTrigger = ClosestPanicTrigger( pSoldier ); // if it's an alarm trigger and team is alerted, ignore it - if ( !(gTacticalStatus.bPanicTriggerIsAlarm[ bPanicTrigger ] && gTacticalStatus.Team[pSoldier->bTeam].bAwareOfOpposition) && PythSpacesAway( pSoldier->sGridNo, gTacticalStatus.sPanicTriggerGridNo[ bPanicTrigger ] ) < 10) + if ( bPanicTrigger != -1 && !(gTacticalStatus.bPanicTriggerIsAlarm[ bPanicTrigger ] && gTacticalStatus.Team[pSoldier->bTeam].bAwareOfOpposition) && PythSpacesAway( pSoldier->sGridNo, gTacticalStatus.sPanicTriggerGridNo[ bPanicTrigger ] ) < 10) { PossiblyMakeThisEnemyChosenOne( pSoldier ); }