From 972681c57ebf7a4512c2ca03c2c3629b4a8faf21 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Wed, 5 May 2021 08:29:53 -0700 Subject: [PATCH] emummc: fix file-based accesses that cross file boundaries --- emummc/source/emuMMC/emummc.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/emummc/source/emuMMC/emummc.c b/emummc/source/emuMMC/emummc.c index b1c1e1e95..6c2fd91a7 100644 --- a/emummc/source/emuMMC/emummc.c +++ b/emummc/source/emuMMC/emummc.c @@ -292,6 +292,35 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned { fp = &f_emu.fp_gpp[sector / f_emu.part_size]; sector = sector % f_emu.part_size; + + // Special handling for reads/writes which cross file-boundaries. + if (__builtin_expect(sector + num_sectors > f_emu.part_size, 0)) + { + unsigned int remaining = num_sectors; + while (remaining > 0) { + const unsigned int cur_sectors = MIN(remaining, f_emu.part_size - sector); + + if (f_lseek(fp, sector << 9) != FR_OK) + return 0; // Out of bounds. + + if (is_write) + { + if (f_write_fast(fp, buf, cur_sectors << 9) != FR_OK) + return 0; + } + else + { + if (f_read_fast(fp, buf, cur_sectors << 9) != FR_OK) + return 0; + } + + remaining -= cur_sectors; + sector = 0; + ++fp; + } + + return 1; + } } else {