diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 4c62a44449..326c939c85 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2236,6 +2236,8 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
virCapsPtr caps = NULL;
char *nodeset;
char *cpuset;
+ int nodesetSize = 0;
+ size_t i;
int ret = -1;
nodeset = virXPathString("string(./numad/@nodeset)", ctxt);
@@ -2247,8 +2249,14 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto cleanup;
+ /* Figure out how big the nodeset bitmap needs to be.
+ * This is necessary because NUMA node IDs are not guaranteed to
+ * start from 0 or be densely allocated */
+ for (i = 0; i < caps->host.nnumaCell; i++)
+ nodesetSize = MAX(nodesetSize, caps->host.numaCell[i]->num + 1);
+
if (nodeset &&
- virBitmapParse(nodeset, &priv->autoNodeset, caps->host.nnumaCell_max) < 0)
+ virBitmapParse(nodeset, &priv->autoNodeset, nodesetSize) < 0)
goto cleanup;
if (cpuset) {
diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml
index 2e166e6e67..c1e57618b6 100644
--- a/tests/qemustatusxml2xmldata/modern-in.xml
+++ b/tests/qemustatusxml2xmldata/modern-in.xml
@@ -252,7 +252,7 @@
-
+