diff options
author | 2018-07-27 23:42:59 -0400 | |
---|---|---|
committer | 2018-07-27 23:43:03 -0400 | |
commit | 952bdf962a554ffab077a79d8b4429e451b4a82d (patch) | |
tree | be4404f825302620f91555d005dd876922184753 | |
parent | c72d28ba0c37ad31719c258787114afcda6404f4 (diff) |
imd_dsk.cpp: Add some sanity checking on geometry
-rw-r--r-- | src/lib/formats/imd_dsk.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/lib/formats/imd_dsk.cpp b/src/lib/formats/imd_dsk.cpp index 8476da6ac38..51337a7f890 100644 --- a/src/lib/formats/imd_dsk.cpp +++ b/src/lib/formats/imd_dsk.cpp @@ -433,6 +433,9 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) if(pos >= size) return false; + int tracks, heads; + image->get_maximal_geometry(tracks, heads); + while(pos < size) { uint8_t mode = img[pos++]; uint8_t track = img[pos++]; @@ -440,8 +443,23 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) uint8_t sector_count = img[pos++]; uint8_t ssize = img[pos++]; + if(track >= tracks) + { + osd_printf_error("imd_format: Track %d exceeds maximum of %d\n", track, tracks); + return false; + } + + if((head & 0x3f) >= heads) + { + osd_printf_error("imd_format: Head %d exceeds maximum of %d\n", head & 0x3f, heads); + return false; + } + if(ssize == 0xff) - throw emu_fatalerror("imd_format: Unsupported variable sector size on track %d head %d", track, head); + { + osd_printf_error("imd_format: Unsupported variable sector size on track %d head %d", track, head & 0x3f); + return false; + } uint32_t actual_size = ssize < 7 ? 128 << ssize : 8192; |