| From 0532f9cc5287358e065937f30890874f7e2c972c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 29 Mar 2021 01:52:22 -0700 |
| Subject: scsi: qla2xxx: Fix use after free in bsg |
| |
| From: Quinn Tran <qutran@marvell.com> |
| |
| [ Upstream commit 2ce35c0821afc2acd5ee1c3f60d149f8b2520ce8 ] |
| |
| On bsg command completion, bsg_job_done() was called while qla driver |
| continued to access the bsg_job buffer. bsg_job_done() would free up |
| resources that ended up being reused by other task while the driver |
| continued to access the buffers. As a result, driver was reading garbage |
| data. |
| |
| localhost kernel: BUG: KASAN: use-after-free in sg_next+0x64/0x80 |
| localhost kernel: Read of size 8 at addr ffff8883228a3330 by task swapper/26/0 |
| localhost kernel: |
| localhost kernel: CPU: 26 PID: 0 Comm: swapper/26 Kdump: |
| loaded Tainted: G OE --------- - - 4.18.0-193.el8.x86_64+debug #1 |
| localhost kernel: Hardware name: HP ProLiant DL360 |
| Gen9/ProLiant DL360 Gen9, BIOS P89 08/12/2016 |
| localhost kernel: Call Trace: |
| localhost kernel: <IRQ> |
| localhost kernel: dump_stack+0x9a/0xf0 |
| localhost kernel: print_address_description.cold.3+0x9/0x23b |
| localhost kernel: kasan_report.cold.4+0x65/0x95 |
| localhost kernel: debug_dma_unmap_sg.part.12+0x10d/0x2d0 |
| localhost kernel: qla2x00_bsg_sp_free+0xaf6/0x1010 [qla2xxx] |
| |
| Link: https://lore.kernel.org/r/20210329085229.4367-6-njavali@marvell.com |
| Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> |
| Signed-off-by: Quinn Tran <qutran@marvell.com> |
| Signed-off-by: Saurav Kashyap <skashyap@marvell.com> |
| Signed-off-by: Nilesh Javali <njavali@marvell.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/qla2xxx/qla_bsg.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c |
| index c1ca21a88a09..06063a841726 100644 |
| --- a/drivers/scsi/qla2xxx/qla_bsg.c |
| +++ b/drivers/scsi/qla2xxx/qla_bsg.c |
| @@ -19,10 +19,11 @@ qla2x00_bsg_job_done(void *ptr, int res) |
| struct bsg_job *bsg_job = sp->u.bsg_job; |
| struct fc_bsg_reply *bsg_reply = bsg_job->reply; |
| |
| + sp->free(sp); |
| + |
| bsg_reply->result = res; |
| bsg_job_done(bsg_job, bsg_reply->result, |
| bsg_reply->reply_payload_rcv_len); |
| - sp->free(sp); |
| } |
| |
| void |
| -- |
| 2.30.2 |
| |