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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user