You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Steps to reproduce:
1. Have a memory card in the system with some number of empty blocks (call that
number n)
2. Launch GCMM, select your sd card/hard drive and go to Restore
3. Attempt to restore a backed up save exactly n blocks large.
Expected behaviour:
GCMM copies the save file to the memory card.
Observed behaviour:
The restore fails, showing this error: "MemCard Error: -6 - File/Dir entry
broken"
Additional information:
I haven't yet been able to test this with a non-empty memory card. My memory
card is official by Nintendo and has a capacity of 59 blocks. I encounter this
issue with my save from Pokémon Box Ruby & Sapphire. That game creates saves
that are 59 blocks large, so I ran into this while trying to restore to an
empty card. I believe the same behaviour would occur if, say, there were 55
used blocks and I tried to restore a save that was 4 blocks large, but I don't
know this for sure.
Cause:
I don't know for sure that this is the cause, though I have a pretty good idea.
In the __card_allocblock function of card.c is the following code:
/*
Since testing free space has already been done, if all the blocks
the file takes up cannot be entered into the FAT, something is
wrong.
*/
count++;
if(count>=((card->blocks)-CARD_SYSAREA)) return CARD_ERROR_BROKEN;
// blah blah blah
}
This code makes sure that you don't step over the end of the card's capacity
while allocating blocks. However, it's slightly overzealous:
"count>=((card->blocks)-CARD_SYSAREA)" is true if the current block is the last
one on the card.
Proposed fix:
I've attached a modified card.c to this issue. The only change is in line 732
(the one referred to above). "count>=[snip]" has been changed to
"count>[snip]". This ensures that the error isn't encountered until the code is
thinking about a block that actually doesn't exist.
This fix allowed me to restore my Pokémon Box save, but I haven't tested it
beyond that. It could cause bugs elsewhere in the code, though I personally
doubt that very much. (To be fair, I don't know anything. This fix is the first
non-"Hello World" C I've ever written. You probably shouldn't trust me.)
Original issue reported on code.google.com by [email protected] on 5 Mar 2015 at 4:16
count = 0;
// blah blah blah
while (1) {
// blah blah blah
}
Original issue reported on code.google.com by
[email protected]
on 5 Mar 2015 at 4:16Attachments:
The text was updated successfully, but these errors were encountered: