|
@@ -836,6 +836,7 @@ static void get_capabilities(struct scsi_cd *cd)
|
|
|
unsigned char *buffer;
|
|
|
struct scsi_mode_data data;
|
|
|
struct scsi_sense_hdr sshdr;
|
|
|
+ unsigned int ms_len = 128;
|
|
|
int rc, n;
|
|
|
|
|
|
static const char *loadmech[] =
|
|
@@ -862,10 +863,11 @@ static void get_capabilities(struct scsi_cd *cd)
|
|
|
scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
|
|
|
|
|
|
/* ask for mode page 0x2a */
|
|
|
- rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
|
|
|
+ rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
|
|
|
SR_TIMEOUT, 3, &data, NULL);
|
|
|
|
|
|
- if (!scsi_status_is_good(rc)) {
|
|
|
+ if (!scsi_status_is_good(rc) || data.length > ms_len ||
|
|
|
+ data.header_length + data.block_descriptor_length > data.length) {
|
|
|
/* failed, drive doesn't have capabilities mode page */
|
|
|
cd->cdi.speed = 1;
|
|
|
cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
|