From e4dc6e54ec34b691f194811cbb88cb241982dfbe Mon Sep 17 00:00:00 2001 From: Stephen White Date: Mon, 2 Jul 2018 18:30:30 +1000 Subject: [PATCH] Fixed bug with https://csdb.dk/release/?id=11627 directory display. grue on Lemon found this image that caused an infinite loop when attempting to display the directory. --- src/FileBrowser.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/FileBrowser.cpp b/src/FileBrowser.cpp index b05fd79..9d643f5 100644 --- a/src/FileBrowser.cpp +++ b/src/FileBrowser.cpp @@ -991,6 +991,8 @@ void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForI if (track != 0) { + unsigned trackPrev = 0xff; + unsigned sectorPrev = 0xff; bool complete = false; // Blocks 1 through 19 on track 18 contain the file entries. The first two bytes of a block point to the next directory block with file entries. If no more directory blocks follow, these bytes contain $00 and $FF, respectively. while (!complete) @@ -1002,8 +1004,11 @@ void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForI unsigned sectorNoNext = buffer[1]; complete = (track == trackNext) && (sectorNo == sectorNoNext); // Detect looping directory entries (raid over moscow ntsc) + complete |= (trackNext == trackPrev) && (sectorNoNext == sectorPrev); // Detect looping directory entries (IndustrialBreakdown) complete |= (trackNext == 00) || (sectorNoNext == 0xff); complete |= (trackNext == 18) && (sectorNoNext == 1); + trackPrev = track; + sectorPrev = sectorNo; track = trackNext; sectorNo = sectorNoNext;