Skip to content

Commit 925adae

Browse files
martinkpetersengregkh
authored andcommitted
scsi: sr: Sanity check returned mode data
commit a00a7862513089f17209b732f230922f1942e0b9 upstream. 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. Reported-by: Kefeng Wang <wangkefeng.wang@huawei.com> Tested-by: Kefeng Wang <wangkefeng.wang@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 1e1de2e commit 925adae

1 file changed

Lines changed: 4 additions & 2 deletions

File tree

drivers/scsi/sr.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,7 @@ static void get_capabilities(struct scsi_cd *cd)
834834
unsigned char *buffer;
835835
struct scsi_mode_data data;
836836
struct scsi_sense_hdr sshdr;
837+
unsigned int ms_len = 128;
837838
int rc, n;
838839

839840
static const char *loadmech[] =
@@ -860,10 +861,11 @@ static void get_capabilities(struct scsi_cd *cd)
860861
scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
861862

862863
/* ask for mode page 0x2a */
863-
rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
864+
rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
864865
SR_TIMEOUT, 3, &data, NULL);
865866

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

0 commit comments

Comments
 (0)