• Dmitry Bogdanov's avatar
    scsi: qla2xxx: Fix unmap of already freed sgl · 4a8f7101
    Dmitry Bogdanov authored
    The sgl is freed in the target stack in target_release_cmd_kref() before
    calling qlt_free_cmd() but there is an unmap of sgl in qlt_free_cmd() that
    causes a panic if sgl is not yet DMA unmapped:
    
    NIP dma_direct_unmap_sg+0xdc/0x180
    LR  dma_direct_unmap_sg+0xc8/0x180
    Call Trace:
     ql_dbg_prefix+0x68/0xc0 [qla2xxx] (unreliable)
     dma_unmap_sg_attrs+0x54/0xf0
     qlt_unmap_sg.part.19+0x54/0x1c0 [qla2xxx]
     qlt_free_cmd+0x124/0x1d0 [qla2xxx]
     tcm_qla2xxx_release_cmd+0x4c/0xa0 [tcm_qla2xxx]
     target_put_sess_cmd+0x198/0x370 [target_core_mod]
     transport_generic_free_cmd+0x6c/0x1b0 [target_core_mod]
     tcm_qla2xxx_complete_free+0x6c/0x90 [tcm_qla2xxx]
    
    The sgl may be left unmapped in error cases of response sending.  For
    instance, qlt_rdy_to_xfer() maps sgl and exits when session is being
    deleted keeping the sgl mapped.
    
    This patch removes use-after-free of the sgl and ensures that the sgl is
    unmapped for any command that was not sent to firmware.
    
    Link: https://lore.kernel.org/r/20211018122650.11846-1-d.bogdanov@yadro.comReviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: default avatarDmitry Bogdanov <d.bogdanov@yadro.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    4a8f7101
qla_target.c 201 KB