From 36c8332cd3f1c6e108124605f60a8a5479bf21ed Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Thu, 2 Jan 2025 10:41:46 +0100 Subject: [PATCH] Fix Trainer Hill OOB array access (#5930) Co-authored-by: sbird --- src/trainer_hill.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/trainer_hill.c b/src/trainer_hill.c index c89803ffb2..dd8ae78aa7 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -212,6 +212,14 @@ static const struct TrainerHillChallenge *const sChallengeData[NUM_TRAINER_HILL_ [HILL_MODE_EXPERT] = &sChallenge_Expert, }; +static const struct TrainerHillFloor *const sFloorData[NUM_TRAINER_HILL_MODES] = +{ + [HILL_MODE_NORMAL] = &sFloors_Normal[0], + [HILL_MODE_VARIETY] = &sFloors_Variety[0], + [HILL_MODE_UNIQUE] = &sFloors_Unique[0], + [HILL_MODE_EXPERT] = &sFloors_Expert[0], +}; + // Unused. static const u8 *const sFloorStrings[] = { @@ -357,20 +365,14 @@ void FreeTrainerHillBattleStruct(void) static void SetUpDataStruct(void) { #if FREE_TRAINER_HILL == FALSE - if (sHillData == NULL) - { - sHillData = AllocZeroed(sizeof(*sHillData)); - sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; + if (sHillData != NULL) return; - // This copy depends on the floor data for each challenge being directly after the - // challenge header data, and for the field 'floors' in sHillData to come directly - // after the field 'challenge'. - // e.g. for HILL_MODE_NORMAL, it will copy sChallenge_Normal to sHillData->challenge and - // it will copy sFloors_Normal to sHillData->floors - CpuCopy32(sChallengeData[gSaveBlock1Ptr->trainerHill.mode], &sHillData->challenge, sizeof(sHillData->challenge) + sizeof(sHillData->floors)); - TrainerHillDummy(); - } -#endif //FREE_TRAINER_HILL + sHillData = AllocZeroed(sizeof(*sHillData)); + sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; + + CpuCopy32(sChallengeData[gSaveBlock1Ptr->trainerHill.mode], &sHillData->challenge, sizeof(sHillData->challenge)); + CpuCopy32(sFloorData[gSaveBlock1Ptr->trainerHill.mode], &sHillData->floors, sizeof(sHillData->floors)); +#endif // FREE_TRAINER_HILL } static void FreeDataStruct(void)