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:
committed by
Greg Kroah-Hartman
parent
24ddcc6a63
commit
b33f28ea45
@@ -317,11 +317,18 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
|
|||||||
if (result)
|
if (result)
|
||||||
return -EIO;
|
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)
|
if (buffer[1] != page)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
return get_unaligned_be16(&buffer[2]) + 4;
|
result = get_unaligned_be16(&buffer[2]);
|
||||||
|
if (!result)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
return result + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user