From 1a33a2bd099763d577d0178d25240374184494c1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 13 Feb 2025 19:47:21 +0100 Subject: [PATCH] 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. --- src/scsi/scsi_cdrom.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 8c24c4623..5d9a6e2f2 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -3672,12 +3672,17 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc) pos += 2; + /* Ignore any page codes with zero length. */ + if (page_len == 0) + continue; + if (dev->drv->is_sony && (page == 0x08) && (page_len == 0x02)) dev->drv->sony_msf = dev->buffer[pos] & 0x01; if (!(dev->ms_page_flags & (1LL << ((uint64_t) page)))) { scsi_cdrom_log(dev->log, "Unimplemented page %02X\n", page); error |= 1; + break; } else { for (i = 0; i < page_len; i++) { 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); scsi_cdrom_invalid_field_pl(dev, val); error |= 1; + break; } } } + + if (error) + break; } pos += page_len; @@ -3716,6 +3725,7 @@ scsi_cdrom_phase_data_out(scsi_common_t *sc) if (error) { scsi_cdrom_buf_free(dev); + scsi_cdrom_command_stop((scsi_common_t *) dev); return 0; } break;