aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinwoo Im <minwoo.im@samsung.com>2024-01-09 11:29:53 +0900
committerKlaus Jensen <k.jensen@samsung.com>2024-03-12 15:48:56 +0100
commit4f0a4a3d5854824e5c5eccf353d4a1f4f749a29d (patch)
tree465f9d3e7be9546f2a9c660492184b25669f93fd
parent8f3f329f5e0117bd1a23a79ab751f8a7d3471e4b (diff)
downloadqemu-4f0a4a3d5854824e5c5eccf353d4a1f4f749a29d.zip
qemu-4f0a4a3d5854824e5c5eccf353d4a1f4f749a29d.tar.gz
qemu-4f0a4a3d5854824e5c5eccf353d4a1f4f749a29d.tar.bz2
hw/nvme: separate 'serial' property for VFs
Currently, when a VF is created, it uses the 'params' object of the PF as it is. In other words, the 'params.serial' string memory area is also shared. In this situation, if the VF is removed from the system, the PF's 'params.serial' object is released with object_finalize() followed by object_property_del_all() which release the memory for 'serial' property. If that happens, the next VF created will inherit a serial from a corrupted memory area. If this happens, an error will occur when comparing subsys->serial and n->params.serial in the nvme_subsys_register_ctrl() function. Cc: qemu-stable@nongnu.org Fixes: 44c2c09488db ("hw/nvme: Add support for SR-IOV") Signed-off-by: Minwoo Im <minwoo.im@samsung.com> Reviewed-by: Klaus Jensen <k.jensen@samsung.com> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
-rw-r--r--hw/nvme/ctrl.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 76fe039..94ef639 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -8309,9 +8309,15 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp)
if (pci_is_vf(pci_dev)) {
/*
* VFs derive settings from the parent. PF's lifespan exceeds
- * that of VF's, so it's safe to share params.serial.
+ * that of VF's.
*/
memcpy(&n->params, &pn->params, sizeof(NvmeParams));
+
+ /*
+ * Set PF's serial value to a new string memory to prevent 'serial'
+ * property object release of PF when a VF is removed from the system.
+ */
+ n->params.serial = g_strdup(pn->params.serial);
n->subsys = pn->subsys;
}