From: Chao Shi <coshi036@gmail.com>
To: Keith Busch <kbusch@kernel.org>, Jens Axboe <axboe@kernel.dk>,
Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>
Cc: linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org,
Chao Shi <coshi036@gmail.com>, Sungwoo Kim <iam@sung-woo.kim>,
Dave Tian <daveti@purdue.edu>, Weidong Zhu <weizhu@fiu.edu>
Subject: [PATCH] nvme: reject completions for requests that are not in flight
Date: Fri, 22 May 2026 11:30:34 -0400 [thread overview]
Message-ID: <20260522153034.2168862-1-coshi036@gmail.com> (raw)
nvme_find_rq() resolves a device-supplied command id to a request with
blk_mq_tag_to_rq(), which returns whatever request last used that tag -
possibly one that is no longer in flight (freed, or never dispatched and
thus with a NULL rq->mq_hctx). Commit e7006de6c238 ("nvme: code
command_id with a genctr for use-after-free validation") guards against
this, but its generation counter is only 4 bits wide and can be matched
by a malfunctioning or malicious device replaying command ids. The
driver then completes a request that is not outstanding, dereferencing a
NULL rq->mq_hctx or double-completing a command:
Oops: general protection fault ... KASAN: null-ptr-deref
RIP: blk_mq_complete_request_remote+0xe5/0xa80 block/blk-mq.c:1319
nvme_handle_cqe drivers/nvme/host/pci.c:1418 [inline]
nvme_poll_cq drivers/nvme/host/pci.c:1449
nvme_irq drivers/nvme/host/pci.c:1463
Require the request to be in flight before completing it. The check uses
the request state, so it also covers controllers with
NVME_QUIRK_SKIP_CID_GEN.
Found by FuzzNvme(Syzkaller with FEMU fuzzing framework).
Acked-by: Sungwoo Kim <iam@sung-woo.kim>
Acked-by: Dave Tian <daveti@purdue.edu>
Acked-by: Weidong Zhu <weizhu@fiu.edu>
Signed-off-by: Chao Shi <coshi036@gmail.com>
---
drivers/nvme/host/nvme.h | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 9a5f28c5103c..3a525c1dc818 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -615,6 +615,17 @@ static inline struct request *nvme_find_rq(struct blk_mq_tags *tags,
tag);
return NULL;
}
+ /*
+ * blk_mq_tag_to_rq() returns whatever request last used this tag, which
+ * may no longer be in flight if the device reports a bogus command id.
+ * Completing it would deref a NULL rq->mq_hctx or double-complete a
+ * command; the 4-bit genctr below only narrows the window.
+ */
+ if (unlikely(blk_mq_rq_state(rq) != MQ_RQ_IN_FLIGHT)) {
+ dev_err(nvme_req(rq)->ctrl->device,
+ "completion for request %#x not in flight\n", tag);
+ return NULL;
+ }
if (unlikely(nvme_genctr_mask(nvme_req(rq)->genctr) != genctr)) {
dev_err(nvme_req(rq)->ctrl->device,
"request %#x genctr mismatch (got %#x expected %#x)\n",
--
2.43.0
next reply other threads:[~2026-05-22 15:30 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-22 15:30 Chao Shi [this message]
2026-05-25 20:27 ` [PATCH] nvme: reject completions for requests that are not in flight Chao S
2026-05-27 14:19 ` Christoph Hellwig
2026-05-27 15:02 ` Jens Axboe
2026-07-15 0:03 ` Chao S
2026-05-27 15:00 ` Keith Busch
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=20260522153034.2168862-1-coshi036@gmail.com \
--to=coshi036@gmail.com \
--cc=axboe@kernel.dk \
--cc=daveti@purdue.edu \
--cc=hch@lst.de \
--cc=iam@sung-woo.kim \
--cc=kbusch@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
--cc=weizhu@fiu.edu \
/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.