From 0c6c112cb9a3a8f12d0f4865743853857bbdc88e Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Mon, 12 May 2025 13:25:22 +0200 Subject: [PATCH] AVOID_UB: FileSelect_LoadGame out of bounds `gBitFlags[-1]` (#2527) --- src/overlays/gamestates/ovl_file_choose/z_file_choose.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index c3d9302ee8..e8934c3731 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -1955,7 +1955,16 @@ void FileSelect_LoadGame(GameState* thisx) { swordEquipValue = (gEquipMasks[EQUIP_TYPE_SWORD] & gSaveContext.save.info.equips.equipment) >> (EQUIP_TYPE_SWORD * 4); gSaveContext.save.info.equips.equipment &= gEquipNegMasks[EQUIP_TYPE_SWORD]; +#ifndef AVOID_UB + //! @bug swordEquipValue can be 0 (EQUIP_VALUE_SWORD_NONE) here (typically, when first starting the game). + //! This leads to reading gBitFlags[-1] (out of bounds). + // gBitFlags[-1] turns out to be 0 in matching versions so this is inconsequential. gSaveContext.save.info.inventory.equipment ^= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, swordEquipValue - 1); +#else + if (swordEquipValue != EQUIP_VALUE_SWORD_NONE) { + gSaveContext.save.info.inventory.equipment ^= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, swordEquipValue - 1); + } +#endif } #if PLATFORM_N64