scsi: aacraid: fix illegal IO beyond last LBA
authorBalsundar P <balsundar.p@microsemi.com>
Tue, 15 Oct 2019 06:21:58 +0000 (11:51 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Oct 2020 18:40:01 +0000 (20:40 +0200)
[ Upstream commit c86fbe484c10b2cd1e770770db2d6b2c88801c1d ]

The driver fails to handle data when read or written beyond device reported
LBA, which triggers kernel panic

Link: https://lore.kernel.org/r/1571120524-6037-2-git-send-email-balsundar.p@microsemi.com
Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/aacraid/aachba.c

index 065f11a1964d4dd8ac1220568325163d9bbc1923..39deea8601d6877994c660a52c53bfd36155e9c1 100644 (file)
@@ -1929,13 +1929,13 @@ static int aac_read(struct scsi_cmnd * scsicmd)
                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
                        SAM_STAT_CHECK_CONDITION;
                set_sense(&dev->fsa_dev[cid].sense_data,
-                         HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
+                         ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
                          ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                       min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
                             SCSI_SENSE_BUFFERSIZE));
                scsicmd->scsi_done(scsicmd);
-               return 1;
+               return 0;
        }
 
        dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
@@ -2023,13 +2023,13 @@ static int aac_write(struct scsi_cmnd * scsicmd)
                scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
                        SAM_STAT_CHECK_CONDITION;
                set_sense(&dev->fsa_dev[cid].sense_data,
-                         HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
+                         ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
                          ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
                memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
                       min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
                             SCSI_SENSE_BUFFERSIZE));
                scsicmd->scsi_done(scsicmd);
-               return 1;
+               return 0;
        }
 
        dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",