Skip to content

Commit 60cd16a

Browse files
stonezdmmartinkpetersen
authored andcommitted
scsi: mvsas: Fix use-after-free bugs in mvs_work_queue
During the detaching of Marvell's SAS/SATA controller, the original code calls cancel_delayed_work() in mvs_free() to cancel the delayed work item mwq->work_q. However, if mwq->work_q is already running, the cancel_delayed_work() may fail to cancel it. This can lead to use-after-free scenarios where mvs_free() frees the mvs_info while mvs_work_queue() is still executing and attempts to access the already-freed mvs_info. A typical race condition is illustrated below: CPU 0 (remove) | CPU 1 (delayed work callback) mvs_pci_remove() | mvs_free() | mvs_work_queue() cancel_delayed_work() | kfree(mvi) | | mvi-> // UAF Replace cancel_delayed_work() with cancel_delayed_work_sync() to ensure that the delayed work item is properly canceled and any executing delayed work item completes before the mvs_info is deallocated. This bug was found by static analysis. Fixes: 20b09c2 ("[SCSI] mvsas: add support for 94xx; layout change; bug fixes") Signed-off-by: Duoming Zhou <duoming@zju.edu.cn> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 0ba7a25 commit 60cd16a

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/scsi/mvsas/mv_init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static void mvs_free(struct mvs_info *mvi)
124124
if (mvi->shost)
125125
scsi_host_put(mvi->shost);
126126
list_for_each_entry(mwq, &mvi->wq_list, entry)
127-
cancel_delayed_work(&mwq->work_q);
127+
cancel_delayed_work_sync(&mwq->work_q);
128128
kfree(mvi->rsvd_tags);
129129
kfree(mvi);
130130
}

0 commit comments

Comments
 (0)