Skip to content

Commit a00a786

Browse files
scsi: sr: Sanity check returned mode data
Kefeng Wang discovered that old versions of the QEMU CD driver would return mangled mode data causing us to walk off the end of the buffer in an attempt to parse it. Sanity check the returned mode sense data. Cc: <[email protected]> Reported-by: Kefeng Wang <[email protected]> Tested-by: Kefeng Wang <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 6780414 commit a00a786

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/scsi/sr.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,7 @@ static void get_capabilities(struct scsi_cd *cd)
836836
unsigned char *buffer;
837837
struct scsi_mode_data data;
838838
struct scsi_sense_hdr sshdr;
839+
unsigned int ms_len = 128;
839840
int rc, n;
840841

841842
static const char *loadmech[] =
@@ -862,10 +863,11 @@ static void get_capabilities(struct scsi_cd *cd)
862863
scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
863864

864865
/* ask for mode page 0x2a */
865-
rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
866+
rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
866867
SR_TIMEOUT, 3, &data, NULL);
867868

868-
if (!scsi_status_is_good(rc)) {
869+
if (!scsi_status_is_good(rc) || data.length > ms_len ||
870+
data.header_length + data.block_descriptor_length > data.length) {
869871
/* failed, drive doesn't have capabilities mode page */
870872
cd->cdi.speed = 1;
871873
cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |

0 commit comments

Comments
 (0)