]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: qla2xxx: Avoid that qlt_send_resp_ctio() corrupts memory
authorBart Van Assche <bvanassche@acm.org>
Wed, 17 Apr 2019 21:44:42 +0000 (14:44 -0700)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 14 Feb 2020 05:29:37 +0000 (00:29 -0500)
BugLink: https://bugs.launchpad.net/bugs/1863019
[ Upstream commit a861b49273578e255426a499842cf7f465456351 ]

The "(&ctio->u.status1.sense_data)[i]" where i >= 0 expressions in
qlt_send_resp_ctio() are probably typos and should have been
"(&ctio->u.status1.sense_data[4 * i])" instead. Instead of only fixing
these typos, modify the code for storing sense data such that it becomes
easy to read. This patch fixes a Coverity complaint about accessing an
array outside its bounds.

Cc: Himanshu Madhani <hmadhani@marvell.com>
Cc: Giridhar Malavali <gmalavali@marvell.com>
Fixes: be25152c0d9e ("qla2xxx: Improve T10-DIF/PI handling in driver.") # v4.11.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Acked-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/scsi/qla2xxx/qla_target.c

index 983970506cdd529302f2878fe0272d413199f0b6..86f5e49caed81a2b3dedc9551d4d380b59a38f25 100644 (file)
@@ -2153,14 +2153,14 @@ void qlt_send_resp_ctio(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
                ctio->u.status1.scsi_status |=
                    cpu_to_le16(SS_RESIDUAL_UNDER);
 
-       /* Response code and sense key */
-       put_unaligned_le32(((0x70 << 24) | (sense_key << 8)),
-           (&ctio->u.status1.sense_data)[0]);
+       /* Fixed format sense data. */
+       ctio->u.status1.sense_data[0] = 0x70;
+       ctio->u.status1.sense_data[2] = sense_key;
        /* Additional sense length */
-       put_unaligned_le32(0x0a, (&ctio->u.status1.sense_data)[1]);
+       ctio->u.status1.sense_data[7] = 0xa;
        /* ASC and ASCQ */
-       put_unaligned_le32(((asc << 24) | (ascq << 16)),
-           (&ctio->u.status1.sense_data)[3]);
+       ctio->u.status1.sense_data[12] = asc;
+       ctio->u.status1.sense_data[13] = ascq;
 
        /* Memory Barrier */
        wmb();