linux/drivers/nvme/target
Shivam Kumar 3def524315 nvme-tcp: fix NULL pointer dereferences in nvmet_tcp_build_pdu_iovec
[ Upstream commit 32b63acd78 ]

Commit efa5630590 ("nvmet-tcp: Fix a kernel panic when host sends an invalid H2C PDU length")
added ttag bounds checking and data_offset
validation in nvmet_tcp_handle_h2c_data_pdu(), but it did not validate
whether the command's data structures (cmd->req.sg and cmd->iov) have
been properly initialized before processing H2C_DATA PDUs.

The nvmet_tcp_build_pdu_iovec() function dereferences these pointers
without NULL checks. This can be triggered by sending H2C_DATA PDU
immediately after the ICREQ/ICRESP handshake, before
sending a CONNECT command or NVMe write command.

Attack vectors that trigger NULL pointer dereferences:
1. H2C_DATA PDU sent before CONNECT → both pointers NULL
2. H2C_DATA PDU for READ command → cmd->req.sg allocated, cmd->iov NULL
3. H2C_DATA PDU for uninitialized command slot → both pointers NULL

The fix validates both cmd->req.sg and cmd->iov before calling
nvmet_tcp_build_pdu_iovec(). Both checks are required because:
- Uninitialized commands: both NULL
- READ commands: cmd->req.sg allocated, cmd->iov NULL
- WRITE commands: both allocated

Fixes: efa5630590 ("nvmet-tcp: Fix a kernel panic when host sends an invalid H2C PDU length")
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Shivam Kumar <kumar.shivam43666@gmail.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2026-01-23 11:18:36 +01:00
..
admin-cmd.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
auth.c block-6.12-20241101 2024-11-01 13:41:55 -10:00
configfs.c nvmet: Don't overflow subsysnqn 2025-01-09 13:33:40 +01:00
core.c nvmet: exit debugfs after discovery subsystem exits 2025-08-15 12:14:08 +02:00
debugfs.c objtool, nvmet: Fix out-of-bounds stack access in nvmet_ctrl_state_show() 2025-04-10 14:39:26 +02:00
debugfs.h nvmet: add debugfs support 2024-06-24 12:53:42 -07:00
discovery.c nvme: rename CDR/MORE/DNR to NVME_STATUS_* 2024-06-24 12:53:42 -07:00
fabrics-cmd-auth.c for-6.11/block-20240710 2024-07-15 14:20:22 -07:00
fabrics-cmd.c for-6.11/block-20240710 2024-07-15 14:20:22 -07:00
fc.c nvmet-fc: avoid scheduling association deletion twice 2025-11-13 15:34:06 -05:00
fcloop.c nvmet-fcloop: access fcpreq only when holding reqlock 2025-06-19 15:32:32 +02:00
io-cmd-bdev.c nvme: fix command limits status code 2025-06-19 15:32:18 +02:00
io-cmd-file.c nvmet: use bvec_set_page to initialize bvecs 2023-02-03 08:20:55 -07:00
Kconfig nvmet-tcp: select CONFIG_TLS from CONFIG_NVME_TARGET_TCP_TLS 2025-05-09 09:50:46 +02:00
loop.c nvme-loop: flush off pending I/O while shutting down loop controller 2024-10-17 11:07:37 -07:00
Makefile nvmet: add debugfs support 2024-06-24 12:53:42 -07:00
nvmet.h nvmet: fix memory leak of bio integrity 2025-07-10 16:04:49 +02:00
passthru.c nvmet-passthru: clear EUID/NGUID/UUID while using loop target 2024-10-01 11:08:40 -07:00
rdma.c nvmet-rdma: recheck queue state is LIVE in state lock in recv done 2025-03-22 12:54:19 -07:00
tcp.c nvme-tcp: fix NULL pointer dereferences in nvmet_tcp_build_pdu_iovec 2026-01-23 11:18:36 +01:00
trace.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
trace.h nvme: trace: avoid memcpy overflow warning 2024-01-05 13:16:18 -08:00
zns.c nvme: rename CDR/MORE/DNR to NVME_STATUS_* 2024-06-24 12:53:42 -07:00