summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-07-27 23:42:59 -0400
committer AJR <ajrhacker@users.noreply.github.com>2018-07-27 23:43:03 -0400
commit952bdf962a554ffab077a79d8b4429e451b4a82d (patch)
treebe4404f825302620f91555d005dd876922184753
parentc72d28ba0c37ad31719c258787114afcda6404f4 (diff)
imd_dsk.cpp: Add some sanity checking on geometry
-rw-r--r--src/lib/formats/imd_dsk.cpp20
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;