From e26eeed02a91cc12a979af380ef5515c7bbe935e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 2 Oct 2018 08:19:47 -0700 Subject: [PATCH] GB, GBA Savedata: Fix leaks when loading masked save (fixes #1197) --- CHANGES | 1 + src/gb/gb.c | 4 ++++ src/gba/gba.c | 2 ++ src/gba/memory.c | 7 ------- src/gba/savedata.c | 4 ++++ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 077514bfb..63ba1d53e 100644 --- a/CHANGES +++ b/CHANGES @@ -114,6 +114,7 @@ Bugfixes: - GB, GBA: Fix broken opposing button filter (fixes mgba.io/i/1191) - Qt: Fix jumbled background when paused - Qt: Fix FPS counter on Windows + - GB, GBA Savedata: Fix leaks when loading masked save (fixes mgba.io/i/1197) Misc: - mGUI: Add SGB border configuration option - mGUI: Add support for different settings types diff --git a/src/gb/gb.c b/src/gb/gb.c index 29b12df2d..fa5408107 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -249,7 +249,11 @@ void GBSramClean(struct GB* gb, uint32_t frameCount) { } void GBSavedataMask(struct GB* gb, struct VFile* vf, bool writeback) { + struct VFile* oldVf = gb->sramVf; GBSramDeinit(gb); + if (oldVf && oldVf != gb->sramRealVf) { + oldVf->close(oldVf); + } gb->sramVf = vf; gb->sramMaskWriteback = writeback; gb->memory.sram = vf->map(vf, gb->sramSize, MAP_READ); diff --git a/src/gba/gba.c b/src/gba/gba.c index 38fa0fc7a..057957161 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -138,6 +138,8 @@ void GBAUnloadROM(struct GBA* gba) { gba->memory.rom = NULL; gba->isPristine = false; + gba->memory.savedata.maskWriteback = false; + GBASavedataUnmask(&gba->memory.savedata); GBASavedataDeinit(&gba->memory.savedata); if (gba->memory.savedata.realVf) { gba->memory.savedata.realVf->close(gba->memory.savedata.realVf); diff --git a/src/gba/memory.c b/src/gba/memory.c index 0ae984eff..384fd81cc 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -99,13 +99,6 @@ void GBAMemoryDeinit(struct GBA* gba) { if (gba->memory.rom) { mappedMemoryFree(gba->memory.rom, gba->memory.romSize); } - gba->memory.savedata.maskWriteback = false; - GBASavedataUnmask(&gba->memory.savedata); - GBASavedataDeinit(&gba->memory.savedata); - if (gba->memory.savedata.realVf) { - gba->memory.savedata.realVf->close(gba->memory.savedata.realVf); - } - if (gba->memory.agbPrintBuffer) { mappedMemoryFree(gba->memory.agbPrintBuffer, SIZE_AGB_PRINT); } diff --git a/src/gba/savedata.c b/src/gba/savedata.c index 1c34100dd..ba702e36b 100644 --- a/src/gba/savedata.c +++ b/src/gba/savedata.c @@ -88,7 +88,11 @@ void GBASavedataDeinit(struct GBASavedata* savedata) { void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf, bool writeback) { enum SavedataType type = savedata->type; + struct VFile* oldVf = savedata->vf; GBASavedataDeinit(savedata); + if (oldVf && oldVf != savedata->realVf) { + oldVf->close(oldVf); + } savedata->vf = vf; savedata->mapMode = MAP_READ; savedata->maskWriteback = writeback;