scsi: lpfc: Prevent use-after-free during rmmod with mapped NVMe rports
authorJustin Tee <justin.tee@broadcom.com>
Fri, 8 Sep 2023 21:19:23 +0000 (14:19 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 14 Sep 2023 00:51:16 +0000 (20:51 -0400)
commitdae40be7a1a72474e225795c0d6f43a4ac596a3f
tree50c3aeb49b9b68e3fa357c8630e1fa3d3c568e49
parent9c3034968ed0feeaf72e5b549b19c7767a1a04f2
scsi: lpfc: Prevent use-after-free during rmmod with mapped NVMe rports

During rmmod, when dev_loss_tmo callback is called, an ndlp kref count is
decremented twice.  Once for SCSI transport registration and second to
remove the initial node allocation kref.  If there is also an NVMe
transport registration, another reference count decrement is expected in
lpfc_nvme_unregister_port().

Race conditions between the NVMe transport remoteport_delete and
dev_loss_tmo callbacks sometimes results in premature ndlp object release
resulting in use-after-free issues.

Fix by not dropping the ndlp object in dev_loss_tmo callback with an
outstanding NVMe transport registration.  Inversely, mark the final
NLP_DROPPED flag in lpfc_nvme_unregister_port when rmmod flag is set.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20230908211923.37603-1-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hbadisc.c
drivers/scsi/lpfc/lpfc_nvme.c