The nodedev schema defines that a mdev_types capability must have
one or more type elements. The XML parsing and the format allows to
accept and to write mdev_types capability without any type element.
This patches fixes this.
Signed-off-by: Boris Fiuczynski <fiuczy(a)linux.ibm.com>
Reviewed-by: Bjoern Walk <bwalk(a)linux.ibm.com>
---
src/conf/node_device_conf.c | 40 ++++++++++++++++++++++---------------
1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 4adfdef572..3fbe9338ee 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -276,25 +276,27 @@ virNodeDeviceCapPCIDefFormat(virBufferPtr buf,
virPCIHeaderTypeToString(data->pci_dev.hdrType));
}
if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_MDEV) {
- virBufferAddLit(buf, "<capability
type='mdev_types'>\n");
- virBufferAdjustIndent(buf, 2);
- for (i = 0; i < data->pci_dev.nmdev_types; i++) {
- virMediatedDeviceTypePtr type = data->pci_dev.mdev_types[i];
- virBufferEscapeString(buf, "<type id='%s'>\n",
type->id);
+ if (data->pci_dev.nmdev_types > 0) {
+ virBufferAddLit(buf, "<capability
type='mdev_types'>\n");
virBufferAdjustIndent(buf, 2);
- if (type->name)
- virBufferEscapeString(buf, "<name>%s</name>\n",
- type->name);
- virBufferEscapeString(buf,
"<deviceAPI>%s</deviceAPI>\n",
- type->device_api);
- virBufferAsprintf(buf,
-
"<availableInstances>%u</availableInstances>\n",
- type->available_instances);
+ for (i = 0; i < data->pci_dev.nmdev_types; i++) {
+ virMediatedDeviceTypePtr type = data->pci_dev.mdev_types[i];
+ virBufferEscapeString(buf, "<type id='%s'>\n",
type->id);
+ virBufferAdjustIndent(buf, 2);
+ if (type->name)
+ virBufferEscapeString(buf,
"<name>%s</name>\n",
+ type->name);
+ virBufferEscapeString(buf,
"<deviceAPI>%s</deviceAPI>\n",
+ type->device_api);
+ virBufferAsprintf(buf,
+
"<availableInstances>%u</availableInstances>\n",
+ type->available_instances);
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</type>\n");
+ }
virBufferAdjustIndent(buf, -2);
- virBufferAddLit(buf, "</type>\n");
+ virBufferAddLit(buf, "</capability>\n");
}
- virBufferAdjustIndent(buf, -2);
- virBufferAddLit(buf, "</capability>\n");
}
if (data->pci_dev.nIommuGroupDevices) {
virBufferAsprintf(buf, "<iommuGroup number='%d'>\n",
@@ -1520,6 +1522,12 @@ virNodeDevPCICapMdevTypesParseXML(xmlXPathContextPtr ctxt,
if ((nmdev_types = virXPathNodeSet("./type", ctxt, &nodes)) < 0)
goto cleanup;
+ if (nmdev_types == 0) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing <type> element in <capability>
element"));
+ goto cleanup;
+ }
+
orignode = ctxt->node;
for (i = 0; i < nmdev_types; i++) {
ctxt->node = nodes[i];
--
2.25.1