linux/drivers/nvme/target
Sagi Grimberg 73c50bd104 nvmet-rdma: fix possible bad dereference when freeing rsps
[ Upstream commit 73964c1d07 ]

It is possible that the host connected and saw a cm established
event and started sending nvme capsules on the qp, however the
ctrl did not yet see an established event. This is why the
rsp_wait_list exists (for async handling of these cmds, we move
them to a pending list).

Furthermore, it is possible that the ctrl cm times out, resulting
in a connect-error cm event. in this case we hit a bad deref [1]
because in nvmet_rdma_free_rsps we assume that all the responses
are in the free list.

We are freeing the cmds array anyways, so don't even bother to
remove the rsp from the free_list. It is also guaranteed that we
are not racing anything when we are releasing the queue so no
other context accessing this array should be running.

[1]:
--
Workqueue: nvmet-free-wq nvmet_rdma_free_queue_work [nvmet_rdma]
[...]
pc : nvmet_rdma_free_rsps+0x78/0xb8 [nvmet_rdma]
lr : nvmet_rdma_free_queue_work+0x88/0x120 [nvmet_rdma]
 Call trace:
 nvmet_rdma_free_rsps+0x78/0xb8 [nvmet_rdma]
 nvmet_rdma_free_queue_work+0x88/0x120 [nvmet_rdma]
 process_one_work+0x1ec/0x4a0
 worker_thread+0x48/0x490
 kthread+0x158/0x160
 ret_from_fork+0x10/0x18
--

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-08-29 17:33:40 +02:00
..
admin-cmd.c nvmet: remove nvmet_req_cns_error_complete 2023-04-13 08:55:05 +02:00
auth.c nvmet-auth: fix nvmet_auth hash error handling 2024-08-03 08:53:22 +02:00
configfs.c nvmet: fix ns enable/disable possible hang 2024-06-12 11:12:53 +02:00
core.c nvmet: always initialize cqe.result 2024-07-25 09:50:46 +02:00
discovery.c nvme: move from strlcpy with unused retval to strscpy 2022-09-19 11:33:53 +02:00
fabrics-cmd-auth.c nvmet: always initialize cqe.result 2024-07-25 09:50:46 +02:00
fabrics-cmd.c nvmet: always initialize cqe.result 2024-07-25 09:50:46 +02:00
fc.c nvmet-fc: take ref count on tgtport before delete assoc 2024-03-01 13:34:52 +01:00
fcloop.c nvmet-fcloop: swap the list_add_tail arguments 2024-03-01 13:34:52 +01:00
io-cmd-bdev.c bio-integrity: update the payload size in bio_integrity_add_page() 2023-08-09 16:05:35 -06:00
io-cmd-file.c nvmet: use bvec_set_page to initialize bvecs 2023-02-03 08:20:55 -07:00
Kconfig nvmet-auth: select the intended CRYPTO_DH_RFC7919_GROUPS 2022-08-02 17:22:51 -06:00
loop.c nvmet: use PAGE_SECTORS_SHIFT 2023-07-10 08:46:30 -07:00
Makefile nvmet: implement basic In-Band Authentication 2022-08-02 17:14:49 -06:00
nvmet.h nvmet: fix nvme status code when namespace is disabled 2024-06-12 11:11:30 +02:00
passthru.c nvmet-passthru: propagate status from id override functions 2024-06-21 14:38:35 +02:00
rdma.c nvmet-rdma: fix possible bad dereference when freeing rsps 2024-08-29 17:33:40 +02:00
tcp.c nvmet-tcp: do not continue for invalid icreq 2024-08-29 17:33:39 +02:00
trace.c nvmet-trace: avoid dereferencing pointer too early 2024-08-29 17:33:32 +02:00
trace.h nvmet-trace: avoid dereferencing pointer too early 2024-08-29 17:33:32 +02:00
zns.c nvmet: rename nvmet_execute_identify_cns_cs_ns 2023-04-13 08:55:04 +02:00