diff options
Diffstat (limited to 'drivers/scsi/scsi.c')
| -rw-r--r-- | drivers/scsi/scsi.c | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 7d2210a006f0..09ef0b31dfc0 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -314,11 +314,18 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,  	if (result)  		return -EIO; -	/* Sanity check that we got the page back that we asked for */ +	/* +	 * Sanity check that we got the page back that we asked for and that +	 * the page size is not 0. +	 */  	if (buffer[1] != page)  		return -EIO; -	return get_unaligned_be16(&buffer[2]) + 4; +	result = get_unaligned_be16(&buffer[2]); +	if (!result) +		return -EIO; + +	return result + 4;  }  static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page) @@ -326,6 +333,9 @@ static int scsi_get_vpd_size(struct scsi_device *sdev, u8 page)  	unsigned char vpd_header[SCSI_VPD_HEADER_SIZE] __aligned(4);  	int result; +	if (sdev->no_vpd_size) +		return SCSI_DEFAULT_VPD_LEN; +  	/*  	 * Fetch the VPD page header to find out how big the page  	 * is. This is done to prevent problems on legacy devices  |