scsi: core: Improve scsi_vpd_inquiry() checks
[ Upstream commit f0aa59a33d2ac2267d260fe21eaf92500df8e7b4 ] Some USB-SATA adapters have broken behavior when an unsupported VPD page is probed: Depending on the VPD page number, a 4-byte header with a valid VPD page number but with a 0 length is returned. Currently, scsi_vpd_inquiry() only checks that the page number is valid to determine if the page is valid, which results in receiving only the 4-byte header for the non-existent page. This error manifests itself very often with page 0xb9 for the Concurrent Positioning Ranges detection done by sd_read_cpr(), resulting in the following error message: sd 0:0:0:0: [sda] Invalid Concurrent Positioning Ranges VPD page Prevent such misleading error message by adding a check in scsi_vpd_inquiry() to verify that the page length is not 0. Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> Link: https://lore.kernel.org/r/20230322022211.116327-1-damien.lemoal@opensource.wdc.com Reviewed-by: Benjamin Block <bblock@linux.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
f729b74bb4
commit
89dcf0dd7a
@ -331,11 +331,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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user