From: Irvin Cote <irvincoteg@gmail.com>
To: hch@lst.de
Cc: kbusch@kernel.org, axboe@fb.com, sagi@grimberg.me,
linux-nvme@lists.infradead.org, chaitanyak@nvidia.com,
Irvin Cote <irvincoteg@gmail.com>
Subject: [PATCH 3/3] nvme-core: preventing double freeing in ctrl release
Date: Tue, 25 Apr 2023 18:18:36 -0300 [thread overview]
Message-ID: <20230425211836.14283-4-irvincoteg@gmail.com> (raw)
In-Reply-To: <20230425211836.14283-1-irvincoteg@gmail.com>
The teardown logic and the release method for
the controller both free the same resources.
This introduces double-freeing issues.
Since the release of the ctrl is the last step
of the teardown, we can solve this by setting the freed
pointers to NULL in the teardown path and add checks
in the release method.
The only issue is with ida_free as ida doesn't offer any way to
indicate that an ID has already been freed.
In our specific case we can set the ID to -1 to indicate that.
We can do that because, the way we've setup ida to manage ctrl instances,
it always returns non-negative IDS.
Signed-off-by: Irvin Cote <irvincoteg@gmail.com>
---
drivers/nvme/host/core.c | 7 +++++--
drivers/nvme/host/pci.c | 8 ++++++--
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 353443250d48..15df7846fde8 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -5091,14 +5091,15 @@ static void nvme_free_ctrl(struct device *dev)
container_of(dev, struct nvme_ctrl, ctrl_device);
struct nvme_subsystem *subsys = ctrl->subsys;
- if (!subsys || ctrl->instance != subsys->instance)
+ if ((!subsys || ctrl->instance != subsys->instance) && ctrl->instance != -1)
ida_free(&nvme_instance_ida, ctrl->instance);
nvme_free_cels(ctrl);
nvme_mpath_uninit(ctrl);
nvme_auth_stop(ctrl);
nvme_auth_free(ctrl);
- __free_page(ctrl->discard_page);
+ if(ctrl->discard_page)
+ __free_page(ctrl->discard_page);
free_opal_dev(ctrl->opal_dev);
if (subsys) {
@@ -5202,8 +5203,10 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
kfree_const(ctrl->device->kobj.name);
out_release_instance:
ida_free(&nvme_instance_ida, ctrl->instance);
+ ctrl->instance = -1;
out_free_discard_page:
__free_page(ctrl->discard_page);
+ ctrl->discard_page = NULL;
return ret;
}
EXPORT_SYMBOL_GPL(nvme_init_ctrl);
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 65e4b9f1b632..ff5c876739bc 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2681,8 +2681,10 @@ static void nvme_pci_free_ctrl(struct nvme_ctrl *ctrl)
nvme_free_tagset(dev);
put_device(dev->dev);
- kfree(dev->queues);
- kfree(dev);
+ if(dev->queues)
+ kfree(dev->queues);
+ if(dev)
+ kfree(dev);
}
static void nvme_reset_work(struct work_struct *work)
@@ -2973,8 +2975,10 @@ static struct nvme_dev *nvme_pci_alloc_dev(struct pci_dev *pdev,
out_put_device:
put_device(dev->dev);
kfree(dev->queues);
+ dev->queues = NULL;
out_free_dev:
kfree(dev);
+ dev = NULL;
nvme_put_ctrl(&dev->ctrl);
return ERR_PTR(ret);
}
--
2.39.2
next prev parent reply other threads:[~2023-04-25 21:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-25 21:18 [PATCH 0/3] Adjusting deref count in nvme_init_ctrl Irvin Cote
2023-04-25 21:18 ` [PATCH 1/3] nvme-core: nvme_init_ctrl cleanup Irvin Cote
2023-04-25 21:18 ` [PATCH 2/3] nvme-pci: Adjusting ctrl deref count Irvin Cote
2023-04-25 21:18 ` Irvin Cote [this message]
2023-04-25 21:45 ` [PATCH 3/3] nvme-core: preventing double freeing in ctrl release Keith Busch
2023-04-25 23:19 ` irvin cote
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=20230425211836.14283-4-irvincoteg@gmail.com \
--to=irvincoteg@gmail.com \
--cc=axboe@fb.com \
--cc=chaitanyak@nvidia.com \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
/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