Patch "scsi: pm8001: Fix use-after-free for aborted SSP/STP sas_task" has been added to the 5.16-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: pm8001: Fix use-after-free for aborted SSP/STP sas_task

to the 5.16-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-pm8001-fix-use-after-free-for-aborted-ssp-stp-s.patch
and it can be found in the queue-5.16 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 74c24eb44f912ef70ad0e0345be5fc51ed6668be
Author: John Garry <john.garry@xxxxxxxxxx>
Date:   Thu Jan 27 21:12:52 2022 +0800

    scsi: pm8001: Fix use-after-free for aborted SSP/STP sas_task
    
    [ Upstream commit df7abcaa1246e2537ab4016077b5443bb3c09378 ]
    
    Currently a use-after-free may occur if a sas_task is aborted by the upper
    layer before we handle the I/O completion in mpi_ssp_completion() or
    mpi_sata_completion().
    
    In this case, the following are the two steps in handling those I/O
    completions:
    
     - Call complete() to inform the upper layer handler of completion of
       the I/O.
    
     - Release driver resources associated with the sas_task in
       pm8001_ccb_task_free() call.
    
    When complete() is called, the upper layer may free the sas_task. As such,
    we should not touch the associated sas_task afterwards, but we do so in the
    pm8001_ccb_task_free() call.
    
    Fix by swapping the complete() and pm8001_ccb_task_free() calls ordering.
    
    Link: https://lore.kernel.org/r/1643289172-165636-4-git-send-email-john.garry@xxxxxxxxxx
    Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx>
    Acked-by: Jack Wang <jinpu.wang@xxxxxxxxx>
    Signed-off-by: John Garry <john.garry@xxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 885bc9e71ff64..ca4820d99dc70 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -2184,9 +2184,9 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		pm8001_dbg(pm8001_ha, FAIL,
 			   "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
 			   t, status, ts->resp, ts->stat);
+		pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
 		if (t->slow_task)
 			complete(&t->slow_task->completion);
-		pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
 	} else {
 		spin_unlock_irqrestore(&t->task_state_lock, flags);
 		pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
@@ -2801,9 +2801,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha,
 		pm8001_dbg(pm8001_ha, FAIL,
 			   "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
 			   t, status, ts->resp, ts->stat);
+		pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
 		if (t->slow_task)
 			complete(&t->slow_task->completion);
-		pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
 	} else {
 		spin_unlock_irqrestore(&t->task_state_lock, flags);
 		spin_unlock_irqrestore(&circularQ->oq_lock,



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux