diff mbox

[1/2] ata: Fix ZBC_OUT command block check

Message ID 20180626071838.15140-2-damien.lemoal@wdc.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Damien Le Moal June 26, 2018, 7:18 a.m. UTC
The block (LBA) specified must not exceed the last addressable LBA,
which is dev->nr_sectors - 1. So fix the correct check is
"if (block >= dev->n_sectors)" and not "if (block > dev->n_sectords)".

Additionally, the asc/ascq to return for an LBA that is not a zone start
LBA should be ILLEGAL REQUEST, regardless if the bad LBA is out of
range.

Reported-by: David Butterfield <david.butterfield@wdc.com>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
---
 drivers/ata/libata-scsi.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

Comments

Greg Kroah-Hartman June 26, 2018, 11:38 a.m. UTC | #1
On Tue, Jun 26, 2018 at 04:18:37PM +0900, Damien Le Moal wrote:
> The block (LBA) specified must not exceed the last addressable LBA,
> which is dev->nr_sectors - 1. So fix the correct check is
> "if (block >= dev->n_sectors)" and not "if (block > dev->n_sectords)".
> 
> Additionally, the asc/ascq to return for an LBA that is not a zone start
> LBA should be ILLEGAL REQUEST, regardless if the bad LBA is out of
> range.
> 
> Reported-by: David Butterfield <david.butterfield@wdc.com>
> Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>

<formletter>

This is not the correct way to submit patches for inclusion in the
stable kernel tree.  Please read:
    https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html
for how to do this properly.

</formletter>
diff mbox

Patch

diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 6a91d04351d9..a5543751f446 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -3805,8 +3805,13 @@  static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc)
 		 */
 		goto invalid_param_len;
 	}
-	if (block > dev->n_sectors)
-		goto out_of_range;
+	if (block >= dev->n_sectors) {
+		/*
+		 * Block must be a valid zone ID (a zone start LBA).
+		 */
+		fp = 2;
+		goto invalid_fld;
+	}
 
 	all = cdb[14] & 0x1;
 
@@ -3837,10 +3842,6 @@  static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc)
  invalid_fld:
 	ata_scsi_set_invalid_field(qc->dev, scmd, fp, 0xff);
 	return 1;
- out_of_range:
-	/* "Logical Block Address out of range" */
-	ata_scsi_set_sense(qc->dev, scmd, ILLEGAL_REQUEST, 0x21, 0x00);
-	return 1;
 invalid_param_len:
 	/* "Parameter list length error" */
 	ata_scsi_set_sense(qc->dev, scmd, ILLEGAL_REQUEST, 0x1a, 0x0);