lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.18 24/47] scsi: lpfc: Resolve NULL ptr dereference after an ELS LOGO is aborted
    Date
    From: James Smart <jsmart2021@gmail.com>

    [ Upstream commit b1b3440f437b75fb2a9b0cfe58df461e40eca474 ]

    A use-after-free crash can occur after an ELS LOGO is aborted.

    Specifically, a nodelist structure is freed and then
    ndlp->vport->cfg_log_verbose is dereferenced in lpfc_nlp_get() when the
    discovery state machine is mistakenly called a second time with
    NLP_EVT_DEVICE_RM argument.

    Rework lpfc_cmpl_els_logo() to prevent the duplicate calls to release a
    nodelist structure.

    Link: https://lore.kernel.org/r/20220603174329.63777-6-jsmart2021@gmail.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/lpfc/lpfc_els.c | 18 +++++++++---------
    1 file changed, 9 insertions(+), 9 deletions(-)

    diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
    index 892b3da1ba45..9e3899580039 100644
    --- a/drivers/scsi/lpfc/lpfc_els.c
    +++ b/drivers/scsi/lpfc/lpfc_els.c
    @@ -3035,18 +3035,10 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
    spin_unlock_irq(&ndlp->lock);
    lpfc_disc_state_machine(vport, ndlp, cmdiocb,
    NLP_EVT_DEVICE_RM);
    - lpfc_els_free_iocb(phba, cmdiocb);
    - lpfc_nlp_put(ndlp);
    -
    - /* Presume the node was released. */
    - return;
    + goto out_rsrc_free;
    }

    out:
    - /* Driver is done with the IO. */
    - lpfc_els_free_iocb(phba, cmdiocb);
    - lpfc_nlp_put(ndlp);
    -
    /* At this point, the LOGO processing is complete. NOTE: For a
    * pt2pt topology, we are assuming the NPortID will only change
    * on link up processing. For a LOGO / PLOGI initiated by the
    @@ -3073,6 +3065,10 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
    ndlp->nlp_DID, ulp_status,
    ulp_word4, tmo,
    vport->num_disc_nodes);
    +
    + lpfc_els_free_iocb(phba, cmdiocb);
    + lpfc_nlp_put(ndlp);
    +
    lpfc_disc_start(vport);
    return;
    }
    @@ -3089,6 +3085,10 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
    lpfc_disc_state_machine(vport, ndlp, cmdiocb,
    NLP_EVT_DEVICE_RM);
    }
    +out_rsrc_free:
    + /* Driver is done with the I/O. */
    + lpfc_els_free_iocb(phba, cmdiocb);
    + lpfc_nlp_put(ndlp);
    }

    /**
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-06-14 04:06    [W:4.439 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site