From 34647ffdca68da94f4fb5b51df4a8dc43758ad77 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 13 Jun 2017 21:14:20 -0700 Subject: [PATCH] GB: Trust ROM header for number of SRAM banks (fixes #726) --- CHANGES | 1 + src/gb/mbc.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index d1fd75541..b1485c69b 100644 --- a/CHANGES +++ b/CHANGES @@ -133,6 +133,7 @@ Misc: - Core: Move savestate creation time to extdata - Debugger: Add mDebuggerRunFrame convenience function - GBA Memory: Remove unused prefetch cruft + - GB: Trust ROM header for number of SRAM banks (fixes mgba.io/i/726) 0.5.2: (2016-12-31) Bugfixes: diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 544f01af8..a26edeac6 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -79,7 +79,11 @@ static bool _isMulticart(const uint8_t* mem) { void GBMBCSwitchSramBank(struct GB* gb, int bank) { size_t bankStart = bank * GB_SIZE_EXTERNAL_RAM; - GBResizeSram(gb, (bank + 1) * GB_SIZE_EXTERNAL_RAM); + if (bankStart + GB_SIZE_EXTERNAL_RAM > gb->sramSize) { + mLOG(GB_MBC, GAME_ERROR, "Attempting to switch to an invalid RAM bank: %0X", bank); + bankStart &= (gb->sramSize - 1); + bank = bankStart / GB_SIZE_EXTERNAL_RAM; + } gb->memory.sramBank = &gb->memory.sram[bankStart]; gb->memory.sramCurrentBank = bank; }