nvme-rdma: fix possible double free of controller async event buffer
Sagi Grimberg
maintainerPATCH 1/1 nvme-rdma: fix possible double free of controller async event buffer
If reconnect/reset failed where the controller async event buffer was freed, we might end up freeing it again as we call nvme_rdma_destroy_admin_queue again in the remove path. Given that the sequence is guaranteed to serialize by .ctrl_stop, we simply set ctrl->async_event_sqe.data to NULL and don't free it in future visits.
--- drivers/nvme/host/rdma.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/nvme/host/rdma.c +5 -2
@@ -732,8 +732,11 @@ static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl,blk_cleanup_queue (ctrl->ctrl.admin_q);nvme_rdma_free_tagset (&ctrl->ctrl, ctrl->ctrl.admin_tagset); } -nvme_rdma_free_qe (ctrl->device->dev, &ctrl->async_event_sqe, -sizeof (struct nvme_command ),DMA_TO_DEVICE ); +if (ctrl->async_event_sqe.data) { +nvme_rdma_free_qe (ctrl->device->dev, &ctrl->async_event_sqe, +sizeof (struct nvme_command ),DMA_TO_DEVICE ); + ctrl->async_event_sqe.data =NULL ; + }nvme_rdma_free_queue (&ctrl->queues[0 ]); }
Signature · 1 line
2.14.1
PATCH 1/1 nvme-rdma: fix possible double free of controller async event buffer
Quoted 6 lines · Sagi Grimberg
If reconnect/reset failed where the controller async event buffer was freed, we might end up freeing it again as we call
nvme_rdma_destroy_admin_queueagain in the remove path. Given that the sequence is guaranteed to serialize by .ctrl_stop, we simply setctrl->async_event_sqe.datato NULL and don't free it in future visits.
Thanks,
applied to nvme-4.18.