From: Chaitanya Kulkarni <chaitanyak@nvidia.com>
To: "sagi@grimberg.me" <sagi@grimberg.me>
Cc: Greg KH <gregkh@linuxfoundation.org>,
Christoph Hellwig <hch@lst.de>,
"security@kernel.org" <security@kernel.org>,
"linux-nvme@lists.infradead.org" <linux-nvme@lists.infradead.org>,
Shivam Kumar <kumar.shivam43666@gmail.com>
Subject: Re: [Bug Report] nvmet-tcp: unbalanced percpu_ref_put on data digest error after nvmet_req_init failure causes refcount underflow, use-after-free, and permanent workqueue deadlock
Date: Mon, 6 Apr 2026 22:16:10 +0000 [thread overview]
Message-ID: <3f15b127-0052-4cdb-b720-112aeda71163@nvidia.com> (raw)
In-Reply-To: <CA+ysrSL_cRe4z6ey+W+LodVF-HXSg8jifGa_wLD3sHT2PLoMDQ@mail.gmail.com>
Sagi,
On 4/6/26 12:25 PM, Shivam Kumar wrote:
>> Can the following patch fix the ref count underflow issue ?
>>
>> diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
>> index 4b8b02341ddc..69e971b179ae 100644
>> --- a/drivers/nvme/target/tcp.c
>> +++ b/drivers/nvme/target/tcp.c
>> @@ -1310,7 +1310,8 @@ static int nvmet_tcp_try_recv_ddgst(struct nvmet_tcp_queue *queue)
>> queue->idx, cmd->req.cmd->common.command_id,
>> queue->pdu.cmd.hdr.type, le32_to_cpu(cmd->recv_ddgst),
>> le32_to_cpu(cmd->exp_ddgst));
>> - nvmet_req_uninit(&cmd->req);
>> + if (!(cmd->flags & NVMET_TCP_F_INIT_FAILED))
>> + nvmet_req_uninit(&cmd->req);
>> nvmet_tcp_free_cmd_buffers(cmd);
>> nvmet_tcp_fatal_error(queue);
>> ret = -EPROTO;
>> --
>> 2.39.5
>>
>> and something like following can fix the race between ICReq handling
>> and queue teardown ?
>>
>> diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
>> index 69e971b179ae..5c03a6505319 100644
>> --- a/drivers/nvme/target/tcp.c
>> +++ b/drivers/nvme/target/tcp.c
>> @@ -408,6 +408,8 @@ static void nvmet_tcp_fatal_error(struct nvmet_tcp_queue *queue)
>> static void nvmet_tcp_socket_error(struct nvmet_tcp_queue *queue, int status)
>> {
>> queue->rcv_state = NVMET_TCP_RECV_ERR;
>> + if (status == -ESHUTDOWN)
>> + return;
>> if (status == -EPIPE || status == -ECONNRESET)
>> kernel_sock_shutdown(queue->sock, SHUT_RDWR);
>> else
>> @@ -922,11 +924,21 @@ static int nvmet_tcp_handle_icreq(struct nvmet_tcp_queue *queue)
>> iov.iov_len = sizeof(*icresp);
>> ret = kernel_sendmsg(queue->sock, &msg, &iov, 1, iov.iov_len);
>> if (ret < 0) {
>> - queue->state = NVMET_TCP_Q_FAILED;
>> + spin_lock_bh(&queue->state_lock);
>> + if (queue->state != NVMET_TCP_Q_DISCONNECTING)
>> + queue->state = NVMET_TCP_Q_FAILED;
>> + spin_unlock_bh(&queue->state_lock);
>> return ret; /* queue removal will cleanup */
>> }
>>
>> + spin_lock_bh(&queue->state_lock);
>> + if (queue->state == NVMET_TCP_Q_DISCONNECTING) {
>> + spin_unlock_bh(&queue->state_lock);
>> + /* Tell nvmet_tcp_socket_error() teardown is already in progress. */
>> + return -ESHUTDOWN;
>> + }
>> queue->state = NVMET_TCP_Q_LIVE;
>> + spin_unlock_bh(&queue->state_lock);
>> nvmet_prepare_receive_pdu(queue);
>> return 0;
>> }
>> --
>> 2.39.5
>>
>>
>> -ck
>>
>>
> Hi Chaitanya
>
> I tested both the patches; these patches fix both the crash paths.
>
> Patch 1 is the same fix I sent earlier, which has Christoph's Reviewed-by.
>
> Tested-by: Shivam Kumar<kumar.shivam43666@gmail.com>
>
> Thanks,
> Shivam Kumar
Can you please take a look before I send a series ?
-ck
prev parent reply other threads:[~2026-04-06 22:16 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CA+ysrS+QrbGfOLk=e0=PZ-py-KO_xZgn827nEg7mh7hGhdUAAw@mail.gmail.com>
[not found] ` <2026031827-carving-overdrawn-5b1f@gregkh>
2026-03-18 22:56 ` [PATCH] nvmet-tcp: check INIT_FAILED before nvmet_req_uninit in digest error path Shivam Kumar
2026-03-20 7:46 ` Christoph Hellwig
2026-04-05 19:54 ` Shivam Kumar
2026-04-07 6:31 ` Christoph Hellwig
2026-04-07 14:26 ` Keith Busch
[not found] ` <CA+ysrSLcSJSgEC7i0GYXPiRY9sbbyEGT60Nh1SJ6PqXWENgSOw@mail.gmail.com>
[not found] ` <CA+ysrSL+3YVGvTKhJ=jL92XZPwjoDpt5D2BK-HeCU975vO-fCQ@mail.gmail.com>
[not found] ` <CA+ysrSJQ2tDiB=zL+GwF=ckhmO62v6GC2bWVUVVDVn7d8Km1mw@mail.gmail.com>
2026-03-25 4:29 ` [Bug Report] nvmet-tcp: unbalanced percpu_ref_put on data digest error after nvmet_req_init failure causes refcount underflow, use-after-free, and permanent workqueue deadlock Chaitanya Kulkarni
2026-04-05 19:55 ` Shivam Kumar
2026-04-06 4:23 ` Chaitanya Kulkarni
2026-04-06 19:25 ` Shivam Kumar
2026-04-06 22:16 ` Chaitanya Kulkarni [this message]
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=3f15b127-0052-4cdb-b720-112aeda71163@nvidia.com \
--to=chaitanyak@nvidia.com \
--cc=gregkh@linuxfoundation.org \
--cc=hch@lst.de \
--cc=kumar.shivam43666@gmail.com \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
--cc=security@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).