Added guards against accessing out-of-bounds floppy drives.

This commit is contained in:
SarahW 2018-02-04 20:35:34 +00:00
commit 7ddc01baf7
2 changed files with 38 additions and 16 deletions

View file

@ -125,7 +125,7 @@ int disc_hole(int drive)
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drives[drive].hole) if (drive < 2 && drives[drive].hole)
{ {
return drives[drive].hole(drive); return drives[drive].hole(drive);
} }
@ -139,7 +139,7 @@ void disc_poll()
{ {
disc_poll_time += disc_period * TIMER_USEC; disc_poll_time += disc_period * TIMER_USEC;
if (drives[disc_drivesel].poll) if (disc_drivesel < 2 && drives[disc_drivesel].poll)
drives[disc_drivesel].poll(); drives[disc_drivesel].poll();
if (disc_notfound) if (disc_notfound)
@ -228,10 +228,6 @@ void disc_reset()
void disc_init() void disc_init()
{ {
// pclog("disc_init %p\n", drives);
drives[0].poll = drives[1].poll = 0;
drives[0].seek = drives[1].seek = 0;
drives[0].readsector = drives[1].readsector = 0;
disc_reset(); disc_reset();
} }
@ -239,7 +235,7 @@ int oldtrack[2] = {0, 0};
void disc_seek(int drive, int track) void disc_seek(int drive, int track)
{ {
// pclog("disc_seek: drive=%i track=%i\n", drive, track); // pclog("disc_seek: drive=%i track=%i\n", drive, track);
if (drives[drive].seek) if (drive < 2 && drives[drive].seek)
drives[drive].seek(drive, track); drives[drive].seek(drive, track);
// if (track != oldtrack[drive]) // if (track != oldtrack[drive])
// fdc_discchange_clear(drive); // fdc_discchange_clear(drive);
@ -251,7 +247,7 @@ void disc_readsector(int drive, int sector, int track, int side, int density, in
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drives[drive].readsector) if (drive < 2 && drives[drive].readsector)
drives[drive].readsector(drive, sector, track, side, density, sector_size); drives[drive].readsector(drive, sector, track, side, density, sector_size);
else else
disc_notfound = 1000; disc_notfound = 1000;
@ -261,7 +257,7 @@ void disc_writesector(int drive, int sector, int track, int side, int density, i
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drives[drive].writesector) if (drive < 2 && drives[drive].writesector)
drives[drive].writesector(drive, sector, track, side, density, sector_size); drives[drive].writesector(drive, sector, track, side, density, sector_size);
else else
disc_notfound = 1000; disc_notfound = 1000;
@ -271,7 +267,7 @@ void disc_readaddress(int drive, int track, int side, int density)
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drives[drive].readaddress) if (drive < 2 && drives[drive].readaddress)
drives[drive].readaddress(drive, track, side, density); drives[drive].readaddress(drive, track, side, density);
} }
@ -279,7 +275,7 @@ void disc_format(int drive, int track, int side, int density, uint8_t fill)
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drives[drive].format) if (drive < 2 && drives[drive].format)
drives[drive].format(drive, track, side, density, fill); drives[drive].format(drive, track, side, density, fill);
else else
disc_notfound = 1000; disc_notfound = 1000;
@ -289,7 +285,7 @@ void disc_stop(int drive)
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drives[drive].stop) if (drive < 2 && drives[drive].stop)
drives[drive].stop(drive); drives[drive].stop(drive);
} }

View file

@ -79,6 +79,9 @@ int fdd_swap = 0;
void fdd_seek(int drive, int track_diff) void fdd_seek(int drive, int track_diff)
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drive >= 2)
return;
fdd[drive].track += track_diff; fdd[drive].track += track_diff;
@ -101,13 +104,17 @@ void fdd_disc_changed(int drive)
drive ^= fdd_swap; drive ^= fdd_swap;
/*Force reload of current track data*/ /*Force reload of current track data*/
disc_seek(drive, fdd[drive].track); if (drive < 2)
disc_seek(drive, fdd[drive].track);
} }
int fdd_track0(int drive) int fdd_track0(int drive)
{ {
drive ^= fdd_swap; drive ^= fdd_swap;
if (drive >= 2)
return 0;
/* If drive is disabled, TRK0 never gets set. */ /* If drive is disabled, TRK0 never gets set. */
if (!drive_types[fdd[drive].type].max_track) return 0; if (!drive_types[fdd[drive].type].max_track) return 0;
@ -122,9 +129,14 @@ void fdd_set_densel(int densel)
int fdd_getrpm(int drive) int fdd_getrpm(int drive)
{ {
int hole = disc_hole(drive); int hole;
drive ^= fdd_swap; drive ^= fdd_swap;
if (drive >= 2)
return 0;
hole = disc_hole(drive);
if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_360)) return 300; if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_360)) return 300;
if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_300)) return 360; if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_300)) return 360;
@ -162,9 +174,14 @@ void fdd_setswap(int swap)
int fdd_can_read_medium(int drive) int fdd_can_read_medium(int drive)
{ {
int hole = disc_hole(drive); int hole;
drive ^= fdd_swap; drive ^= fdd_swap;
if (drive >= 2)
return 0;
hole = disc_hole(drive);
hole = 1 << (hole + 3); hole = 1 << (hole + 3);
@ -174,25 +191,34 @@ int fdd_can_read_medium(int drive)
int fdd_doublestep_40(int drive) int fdd_doublestep_40(int drive)
{ {
if (drive >= 2)
return 0;
return drive_types[fdd[drive].type].flags & FLAG_DOUBLE_STEP; return drive_types[fdd[drive].type].flags & FLAG_DOUBLE_STEP;
} }
void fdd_set_type(int drive, int type) void fdd_set_type(int drive, int type)
{ {
fdd[drive].type = type; if (drive < 2)
fdd[drive].type = type;
} }
int fdd_get_type(int drive) int fdd_get_type(int drive)
{ {
if (drive >= 2)
return 0;
return fdd[drive].type; return fdd[drive].type;
} }
int fdd_is_525(int drive) int fdd_is_525(int drive)
{ {
if (drive >= 2)
return 0;
return drive_types[fdd[drive].type].flags & FLAG_525; return drive_types[fdd[drive].type].flags & FLAG_525;
} }
int fdd_is_ed(int drive) int fdd_is_ed(int drive)
{ {
if (drive >= 2)
return 0;
return drive_types[fdd[drive].type].flags & FLAG_HOLE2; return drive_types[fdd[drive].type].flags & FLAG_HOLE2;
} }