From: sashiko-bot@kernel.org
To: "Linmao Li" <lilinmao@kylinos.cn>
Cc: linux-scsi@vger.kernel.org
Subject: Re: [PATCH 2/2] scsi: fnic: free the NVMe port template from the delete callback
Date: Wed, 19 Aug 2026 11:52:11 +0000 [thread overview]
Message-ID: <20260819115211.D46EB1F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260819114242.3598034-3-lilinmao@kylinos.cn>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [Critical] Relocating `kfree(iport->nv_tmpl)` to the asynchronous `nvfnic_local_port_delete()` callback introduces a severe arbitrary free and memory corruption vulnerability if the unregister process times out.
Pre-existing issues:
- [Critical] The driver's bounded timeout design for NVMe FC unregistration leaves the `fnic` structure vulnerable to a Use-After-Free when deferred callbacks execute.
--
--- Patch [2]: [PATCH 2/2] scsi: fnic: free the NVMe port template from the delete callback ---
commit 99ed8cf7442e7f3171f98e582e611d65cec9862a
Author: Linmao Li <lilinmao@kylinos.cn>
scsi: fnic: free the NVMe port template from the delete callback
This commit attempts to fix a dangling pointer issue by moving the
freeing of the NVMe port template to the deferred local port delete callback,
tying its lifetime to the transport's use instead of a bounded timeout.
> diff --git a/drivers/scsi/fnic/fnic_nvme.c b/drivers/scsi/fnic/fnic_nvme.c
> index 00d9d5d439a38..a8b7b7d40b9ab 100644
> --- a/drivers/scsi/fnic/fnic_nvme.c
> +++ b/drivers/scsi/fnic/fnic_nvme.c
> @@ -1243,7 +1243,6 @@ void nvfnic_nvme_unload(struct fnic *fnic)
> WARN_ON(1);
> }
> iport->flags &= ~FNIC_LPORT_NVME_REGISTERED;
> - kfree(iport->nv_tmpl);
> }
> }
[ ... ]
> @@ -1669,6 +1668,9 @@ void nvfnic_local_port_delete(struct nvme_fc_local_port *lport)
> FNIC_NVME_DBG(KERN_INFO, fnic, "lport delete 0x%x\n",
> iport->fcid);
>
> + kfree(iport->nv_tmpl);
[Severity: Critical]
Does moving this kfree() here introduce an arbitrary free if the unregister
process times out?
If the bounded timeout in nvfnic_nvme_unload() expires:
nvfnic_nvme_unload()
time_remain = wait_for_completion_timeout(fnic->nvme_lport_unreg_done,
msecs_to_jiffies(time_wait));
The driver can abandon the wait and eventually free the fnic structure, which
embeds the iport. When the transport later invokes this deferred callback,
the iport pointer will point to freed memory.
Could this cause the kernel to execute an arbitrary free by passing a
corrupted iport->nv_tmpl pointer to kfree()?
> + iport->nv_tmpl = NULL;
> +
> spin_lock_irqsave(&fnic->fnic_lock, flags);
[Severity: Critical]
This is a pre-existing issue, but does the bounded timeout design for NVMe FC
unregistration leave the fnic structure vulnerable to a use-after-free?
Similar to the issue above, if the wait_for_completion_timeout() in
nvfnic_nvme_unload() expires and the driver frees the fnic structure, this
callback will attempt to acquire fnic->fnic_lock on freed memory.
Since the transport can asynchronously invoke the localport_delete callback
long after the driver has given up waiting, is it safe to dereference the fnic
pointer here?
> if (fnic->nvme_lport_unreg_done)
> complete(fnic->nvme_lport_unreg_done);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260819114242.3598034-1-lilinmao@kylinos.cn?part=2
next prev parent reply other threads:[~2026-08-19 11:52 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 11:42 [PATCH 0/2] scsi: fnic: fix NVMe/FC local port setup and teardown Linmao Li
2026-08-19 11:42 ` [PATCH 1/2] scsi: fnic: initialize the NVMe local port info before registering Linmao Li
2026-08-19 11:42 ` [PATCH 2/2] scsi: fnic: free the NVMe port template from the delete callback Linmao Li
2026-08-19 11:52 ` sashiko-bot [this message]
2026-08-19 12:47 ` Linmao Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260819115211.D46EB1F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=lilinmao@kylinos.cn \
--cc=linux-scsi@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.