CD-ROM: Ignore zero-length pages on MODE SELECT, and also stop properly on error.

TODO: Apply to SCSI Disk, ZIP, and MO as well.
This commit is contained in:
OBattler
2025-02-13 19:47:21 +01:00
parent 48f42af745
commit 1a33a2bd09

View File

@@ -3672,12 +3672,17 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
pos += 2; pos += 2;
/* Ignore any page codes with zero length. */
if (page_len == 0)
continue;
if (dev->drv->is_sony && (page == 0x08) && (page_len == 0x02)) if (dev->drv->is_sony && (page == 0x08) && (page_len == 0x02))
dev->drv->sony_msf = dev->buffer[pos] & 0x01; dev->drv->sony_msf = dev->buffer[pos] & 0x01;
if (!(dev->ms_page_flags & (1LL << ((uint64_t) page)))) { if (!(dev->ms_page_flags & (1LL << ((uint64_t) page)))) {
scsi_cdrom_log(dev->log, "Unimplemented page %02X\n", page); scsi_cdrom_log(dev->log, "Unimplemented page %02X\n", page);
error |= 1; error |= 1;
break;
} else { } else {
for (i = 0; i < page_len; i++) { for (i = 0; i < page_len; i++) {
uint8_t pg = page; uint8_t pg = page;
@@ -3698,9 +3703,13 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
"%02X on page %02X\n", i + 2, page); "%02X on page %02X\n", i + 2, page);
scsi_cdrom_invalid_field_pl(dev, val); scsi_cdrom_invalid_field_pl(dev, val);
error |= 1; error |= 1;
break;
} }
} }
} }
if (error)
break;
} }
pos += page_len; pos += page_len;
@@ -3716,6 +3725,7 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc)
if (error) { if (error) {
scsi_cdrom_buf_free(dev); scsi_cdrom_buf_free(dev);
scsi_cdrom_command_stop((scsi_common_t *) dev);
return 0; return 0;
} }
break; break;