From aa14709a4771924fdd880eecba46417c61736cc8 Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Mon, 11 Jul 2011 19:29:09 +0200 Subject: [PATCH] Add domain type checking The drivers were accepting domain configs without checking if those were actually meant for them. For example the LXC driver happily accepts configs with type QEMU. Add a check for the expected domain types to the virDomainDefParse* functions. --- src/conf/domain_conf.c | 84 ++++++++++++++++++++++++++++++----- src/conf/domain_conf.h | 5 +++ src/esx/esx_driver.c | 5 ++- src/libxl/libxl_driver.c | 15 +++++-- src/lxc/lxc_controller.c | 1 + src/lxc/lxc_driver.c | 13 ++++-- src/openvz/openvz_driver.c | 2 + src/phyp/phyp_driver.c | 1 + src/qemu/qemu_domain.h | 6 +++ src/qemu/qemu_driver.c | 15 +++++-- src/qemu/qemu_migration.c | 3 ++ src/security/virt-aa-helper.c | 2 +- src/test/test_driver.c | 10 ++++- src/uml/uml_driver.c | 8 +++- src/vbox/vbox_tmpl.c | 1 + src/vmware/vmware_driver.c | 2 + src/xen/xen_driver.c | 5 +-- src/xen/xend_internal.c | 5 ++- src/xen/xm_internal.c | 1 + src/xenapi/xenapi_driver.c | 8 +++- tests/define-dev-segfault | 2 +- tests/qemuxml2argvtest.c | 2 + tests/qemuxml2xmltest.c | 4 +- tests/xmconfigtest.c | 2 +- tests/xml2sexprtest.c | 2 +- tests/xml2vmxtest.c | 3 +- 26 files changed, 165 insertions(+), 42 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 2315c9802..3cf7f4421 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "virterror_internal.h" #include "datatypes.h" @@ -47,9 +48,15 @@ #include "storage_file.h" #include "files.h" #include "bitmap.h" +#include "verify.h" +#include "count-one-bits.h" #define VIR_FROM_THIS VIR_FROM_DOMAIN +/* virDomainVirtType is used to set bits in the expectedVirtTypes bitmask, + * verify that it doesn't overflow an unsigned int when shifting */ +verify(VIR_DOMAIN_VIRT_LAST <= 32); + VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST, "custom-argv", "custom-monitor", @@ -1264,7 +1271,7 @@ virDomainObjSetDefTransient(virCapsPtr caps, if (!(xml = virDomainDefFormat(domain->def, VIR_DOMAIN_XML_WRITE_FLAGS))) goto out; - if (!(newDef = virDomainDefParseString(caps, xml, + if (!(newDef = virDomainDefParseString(caps, xml, -1, VIR_DOMAIN_XML_READ_FLAGS))) goto out; @@ -5816,6 +5823,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, xmlDocPtr xml, xmlNodePtr root, xmlXPathContextPtr ctxt, + unsigned int expectedVirtTypes, unsigned int flags) { xmlNodePtr *nodes = NULL, node = NULL; @@ -5852,6 +5860,45 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, } VIR_FREE(tmp); + if ((expectedVirtTypes & (1 << def->virtType)) == 0) { + if (count_one_bits(expectedVirtTypes) == 1) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected domain type %s, expecting %s"), + virDomainVirtTypeToString(def->virtType), + virDomainVirtTypeToString(log2(expectedVirtTypes))); + } else { + virBuffer buffer = VIR_BUFFER_INITIALIZER; + char *string; + + for (i = 0; i < VIR_DOMAIN_VIRT_LAST; ++i) { + if ((expectedVirtTypes & (1 << i)) != 0) { + if (virBufferUse(&buffer) > 0) + virBufferAddLit(&buffer, ", "); + + virBufferAdd(&buffer, virDomainVirtTypeToString(i), -1); + } + } + + if (virBufferError(&buffer)) { + virReportOOMError(); + virBufferFreeAndReset(&buffer); + goto error; + } + + string = virBufferContentAndReset(&buffer); + + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected domain type %s, " + "expecting one of these: %s"), + virDomainVirtTypeToString(def->virtType), + string); + + VIR_FREE(string); + } + + goto error; + } + /* Extract domain name */ if (!(def->name = virXPathString("string(./name[1])", ctxt))) { virDomainReportError(VIR_ERR_NO_NAME, NULL); @@ -6760,6 +6807,7 @@ no_memory: static virDomainObjPtr virDomainObjParseXML(virCapsPtr caps, xmlDocPtr xml, xmlXPathContextPtr ctxt, + unsigned int expectedVirtTypes, unsigned int flags) { char *tmp = NULL; @@ -6783,7 +6831,8 @@ static virDomainObjPtr virDomainObjParseXML(virCapsPtr caps, oldnode = ctxt->node; ctxt->node = config; - obj->def = virDomainDefParseXML(caps, xml, config, ctxt, flags); + obj->def = virDomainDefParseXML(caps, xml, config, ctxt, expectedVirtTypes, + flags); ctxt->node = oldnode; if (!obj->def) goto error; @@ -6857,13 +6906,15 @@ static virDomainDefPtr virDomainDefParse(const char *xmlStr, const char *filename, virCapsPtr caps, + unsigned int expectedVirtTypes, unsigned int flags) { xmlDocPtr xml; virDomainDefPtr def = NULL; if ((xml = virXMLParse(filename, xmlStr, "domain.xml"))) { - def = virDomainDefParseNode(caps, xml, xmlDocGetRootElement(xml), flags); + def = virDomainDefParseNode(caps, xml, xmlDocGetRootElement(xml), + expectedVirtTypes, flags); xmlFreeDoc(xml); } @@ -6872,22 +6923,25 @@ virDomainDefParse(const char *xmlStr, virDomainDefPtr virDomainDefParseString(virCapsPtr caps, const char *xmlStr, + unsigned int expectedVirtTypes, unsigned int flags) { - return virDomainDefParse(xmlStr, NULL, caps, flags); + return virDomainDefParse(xmlStr, NULL, caps, expectedVirtTypes, flags); } virDomainDefPtr virDomainDefParseFile(virCapsPtr caps, const char *filename, + unsigned int expectedVirtTypes, unsigned int flags) { - return virDomainDefParse(NULL, filename, caps, flags); + return virDomainDefParse(NULL, filename, caps, expectedVirtTypes, flags); } virDomainDefPtr virDomainDefParseNode(virCapsPtr caps, xmlDocPtr xml, xmlNodePtr root, + unsigned int expectedVirtTypes, unsigned int flags) { xmlXPathContextPtr ctxt = NULL; @@ -6906,7 +6960,7 @@ virDomainDefPtr virDomainDefParseNode(virCapsPtr caps, } ctxt->node = root; - def = virDomainDefParseXML(caps, xml, root, ctxt, flags); + def = virDomainDefParseXML(caps, xml, root, ctxt, expectedVirtTypes, flags); cleanup: xmlXPathFreeContext(ctxt); @@ -6918,6 +6972,7 @@ static virDomainObjPtr virDomainObjParseNode(virCapsPtr caps, xmlDocPtr xml, xmlNodePtr root, + unsigned int expectedVirtTypes, unsigned int flags) { xmlXPathContextPtr ctxt = NULL; @@ -6936,7 +6991,7 @@ virDomainObjParseNode(virCapsPtr caps, } ctxt->node = root; - obj = virDomainObjParseXML(caps, xml, ctxt, flags); + obj = virDomainObjParseXML(caps, xml, ctxt, expectedVirtTypes, flags); cleanup: xmlXPathFreeContext(ctxt); @@ -6946,6 +7001,7 @@ cleanup: virDomainObjPtr virDomainObjParseFile(virCapsPtr caps, const char *filename, + unsigned int expectedVirtTypes, unsigned int flags) { xmlDocPtr xml; @@ -6953,7 +7009,8 @@ virDomainObjPtr virDomainObjParseFile(virCapsPtr caps, if ((xml = virXMLParseFile(filename))) { obj = virDomainObjParseNode(caps, xml, - xmlDocGetRootElement(xml), flags); + xmlDocGetRootElement(xml), + expectedVirtTypes, flags); xmlFreeDoc(xml); } @@ -10142,6 +10199,7 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps, const char *configDir, const char *autostartDir, const char *name, + unsigned int expectedVirtTypes, virDomainLoadConfigNotify notify, void *opaque) { @@ -10153,7 +10211,7 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps, if ((configFile = virDomainConfigFile(configDir, name)) == NULL) goto error; - if (!(def = virDomainDefParseFile(caps, configFile, + if (!(def = virDomainDefParseFile(caps, configFile, expectedVirtTypes, VIR_DOMAIN_XML_INACTIVE))) goto error; @@ -10198,6 +10256,7 @@ static virDomainObjPtr virDomainLoadStatus(virCapsPtr caps, virDomainObjListPtr doms, const char *statusDir, const char *name, + unsigned int expectedVirtTypes, virDomainLoadConfigNotify notify, void *opaque) { @@ -10208,7 +10267,7 @@ static virDomainObjPtr virDomainLoadStatus(virCapsPtr caps, if ((statusFile = virDomainConfigFile(statusDir, name)) == NULL) goto error; - if (!(obj = virDomainObjParseFile(caps, statusFile, + if (!(obj = virDomainObjParseFile(caps, statusFile, expectedVirtTypes, VIR_DOMAIN_XML_INTERNAL_STATUS))) goto error; @@ -10243,6 +10302,7 @@ int virDomainLoadAllConfigs(virCapsPtr caps, const char *configDir, const char *autostartDir, int liveStatus, + unsigned int expectedVirtTypes, virDomainLoadConfigNotify notify, void *opaque) { @@ -10277,6 +10337,7 @@ int virDomainLoadAllConfigs(virCapsPtr caps, doms, configDir, entry->d_name, + expectedVirtTypes, notify, opaque); else @@ -10285,6 +10346,7 @@ int virDomainLoadAllConfigs(virCapsPtr caps, configDir, autostartDir, entry->d_name, + expectedVirtTypes, notify, opaque); if (dom) { @@ -11104,7 +11166,7 @@ virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom) if (!xml) return NULL; - ret = virDomainDefParseString(caps, xml, VIR_DOMAIN_XML_READ_FLAGS); + ret = virDomainDefParseString(caps, xml, -1, VIR_DOMAIN_XML_READ_FLAGS); VIR_FREE(xml); return ret; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0af6d5b09..8262d25e9 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1404,17 +1404,21 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps, unsigned int flags); virDomainDefPtr virDomainDefParseString(virCapsPtr caps, const char *xmlStr, + unsigned int expectedVirtTypes, unsigned int flags); virDomainDefPtr virDomainDefParseFile(virCapsPtr caps, const char *filename, + unsigned int expectedVirtTypes, unsigned int flags); virDomainDefPtr virDomainDefParseNode(virCapsPtr caps, xmlDocPtr doc, xmlNodePtr root, + unsigned int expectedVirtTypes, unsigned int flags); virDomainObjPtr virDomainObjParseFile(virCapsPtr caps, const char *filename, + unsigned int expectedVirtTypes, unsigned int flags); bool virDomainDefCheckABIStability(virDomainDefPtr src, @@ -1489,6 +1493,7 @@ int virDomainLoadAllConfigs(virCapsPtr caps, const char *configDir, const char *autostartDir, int liveStatus, + unsigned int expectedVirtTypes, virDomainLoadConfigNotify notify, void *opaque); diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index f68ede0b2..ddb8c23ba 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2856,7 +2856,8 @@ esxDomainXMLToNative(virConnectPtr conn, const char *nativeFormat, return NULL; } - def = virDomainDefParseString(priv->caps, domainXml, 0); + def = virDomainDefParseString(priv->caps, domainXml, + 1 << VIR_DOMAIN_VIRT_VMWARE, 0); if (def == NULL) { return NULL; @@ -3069,7 +3070,7 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml) } /* Parse domain XML */ - def = virDomainDefParseString(priv->caps, xml, + def = virDomainDefParseString(priv->caps, xml, 1 << VIR_DOMAIN_VIRT_VMWARE, VIR_DOMAIN_XML_INACTIVE); if (def == NULL) { diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 586d56204..21a343e97 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -281,6 +281,7 @@ libxlSaveImageOpen(libxlDriverPrivatePtr driver, const char *from, } if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) goto error; @@ -994,7 +995,8 @@ libxlStartup(int privileged) { &libxl_driver->domains, libxl_driver->stateDir, libxl_driver->autostartDir, - 1, NULL, NULL) < 0) + 1, 1 << VIR_DOMAIN_VIRT_XEN, + NULL, NULL) < 0) goto error; libxlReconnectDomains(libxl_driver); @@ -1004,7 +1006,8 @@ libxlStartup(int privileged) { &libxl_driver->domains, libxl_driver->configDir, libxl_driver->autostartDir, - 0, NULL, NULL) < 0) + 0, 1 << VIR_DOMAIN_VIRT_XEN, + NULL, NULL) < 0) goto error; virHashForEach(libxl_driver->domains.objs, libxlAutostartDomain, @@ -1037,7 +1040,8 @@ libxlReload(void) &libxl_driver->domains, libxl_driver->configDir, libxl_driver->autostartDir, - 1, NULL, libxl_driver); + 1, 1 << VIR_DOMAIN_VIRT_XEN, + NULL, libxl_driver); virHashForEach(libxl_driver->domains.objs, libxlAutostartDomain, libxl_driver); @@ -1207,6 +1211,7 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, libxlDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -2566,7 +2571,8 @@ libxlDomainXMLToNative(virConnectPtr conn, const char * nativeFormat, goto cleanup; } - if (!(def = virDomainDefParseString(driver->caps, domainXml, 0))) + if (!(def = virDomainDefParseString(driver->caps, domainXml, + 1 << VIR_DOMAIN_VIRT_XEN, 0))) goto cleanup; if (!(conf = xenFormatXM(conn, def, ver_info->xen_version_major))) @@ -2668,6 +2674,7 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml) libxlDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 31c7d4fd4..346edef18 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -926,6 +926,7 @@ int main(int argc, char *argv[]) goto cleanup; if ((def = virDomainDefParseFile(caps, configFile, + 1 << VIR_DOMAIN_VIRT_LXC, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 799a5e71a..2ce1fb9a9 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -409,10 +409,11 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) lxcDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_LXC, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if ((dupVM = virDomainObjIsDuplicate(&driver->domains, def, 0)) < 0) + if ((dupVM = virDomainObjIsDuplicate(&driver->domains, def, 0)) < 0) goto cleanup; if ((def->nets != NULL) && !(driver->have_netns)) { @@ -1751,6 +1752,7 @@ lxcDomainCreateAndStart(virConnectPtr conn, lxcDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_LXC, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -2138,7 +2140,8 @@ static int lxcStartup(int privileged) &lxc_driver->domains, lxc_driver->stateDir, NULL, - 1, NULL, NULL) < 0) + 1, 1 << VIR_DOMAIN_VIRT_LXC, + NULL, NULL) < 0) goto cleanup; virHashForEach(lxc_driver->domains.objs, lxcReconnectVM, lxc_driver); @@ -2148,7 +2151,8 @@ static int lxcStartup(int privileged) &lxc_driver->domains, lxc_driver->configDir, lxc_driver->autostartDir, - 0, NULL, NULL) < 0) + 0, 1 << VIR_DOMAIN_VIRT_LXC, + NULL, NULL) < 0) goto cleanup; lxcDriverUnlock(lxc_driver); @@ -2193,7 +2197,8 @@ lxcReload(void) { &lxc_driver->domains, lxc_driver->configDir, lxc_driver->autostartDir, - 0, lxcNotifyLoadDomain, lxc_driver); + 0, 1 << VIR_DOMAIN_VIRT_LXC, + lxcNotifyLoadDomain, lxc_driver); lxcDriverUnlock(lxc_driver); lxcAutostartConfigs(lxc_driver); diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 2c6c870ee..c1d91e468 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -887,6 +887,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml) openvzDriverLock(driver); if ((vmdef = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_OPENVZ, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; @@ -966,6 +967,7 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml, openvzDriverLock(driver); if ((vmdef = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_OPENVZ, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index d1ab5b42b..f6f55c405 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -3611,6 +3611,7 @@ phypDomainCreateAndStart(virConnectPtr conn, virCheckFlags(0, NULL); if (!(def = virDomainDefParseString(phyp_driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_PHYP, VIR_DOMAIN_XML_SECURE))) goto err; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f282df278..d78c4b4c5 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -30,6 +30,12 @@ # include "qemu_conf.h" # include "bitmap.h" +# define QEMU_EXPECTED_VIRT_TYPES \ + ((1 << VIR_DOMAIN_VIRT_QEMU) | \ + (1 << VIR_DOMAIN_VIRT_KQEMU) | \ + (1 << VIR_DOMAIN_VIRT_KVM) | \ + (1 << VIR_DOMAIN_VIRT_XEN)) + /* Only 1 job is allowed at any time * A job includes *all* monitor commands, even those just querying * information, not merely actions */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a05a1ee99..1356c54e7 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -612,7 +612,8 @@ qemudStartup(int privileged) { &qemu_driver->domains, qemu_driver->stateDir, NULL, - 1, NULL, NULL) < 0) + 1, QEMU_EXPECTED_VIRT_TYPES, + NULL, NULL) < 0) goto error; conn = virConnectOpen(qemu_driver->privileged ? @@ -626,7 +627,8 @@ qemudStartup(int privileged) { &qemu_driver->domains, qemu_driver->configDir, qemu_driver->autostartDir, - 0, NULL, NULL) < 0) + 0, QEMU_EXPECTED_VIRT_TYPES, + NULL, NULL) < 0) goto error; @@ -689,7 +691,8 @@ qemudReload(void) { &qemu_driver->domains, qemu_driver->configDir, qemu_driver->autostartDir, - 0, qemudNotifyLoadDomain, qemu_driver); + 0, QEMU_EXPECTED_VIRT_TYPES, + qemudNotifyLoadDomain, qemu_driver); qemuDriverUnlock(qemu_driver); qemuAutostartDomains(qemu_driver); @@ -1253,6 +1256,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml, qemuDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -3606,6 +3610,7 @@ qemuDomainSaveImageOpen(struct qemud_driver *driver, /* Create a domain from this XML */ if (!(def = virDomainDefParseString(driver->caps, xml, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto error; @@ -3924,7 +3929,8 @@ static char *qemuDomainXMLToNative(virConnectPtr conn, goto cleanup; } - def = virDomainDefParseString(driver->caps, xmlData, 0); + def = virDomainDefParseString(driver->caps, xmlData, + QEMU_EXPECTED_VIRT_TYPES, 0); if (!def) goto cleanup; @@ -4222,6 +4228,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) { qemuDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3e4f4feb3..1bca4b832 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1019,6 +1019,7 @@ char *qemuMigrationBegin(struct qemud_driver *driver, if (xmlin) { if (!(def = virDomainDefParseString(driver->caps, xmlin, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -1078,6 +1079,7 @@ qemuMigrationPrepareTunnel(struct qemud_driver *driver, /* Parse the domain XML. */ if (!(def = virDomainDefParseString(driver->caps, dom_xml, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -1313,6 +1315,7 @@ qemuMigrationPrepareDirect(struct qemud_driver *driver, /* Parse the domain XML. */ if (!(def = virDomainDefParseString(driver->caps, dom_xml, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index afc0d3337..fb54dc5e1 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -725,7 +725,7 @@ get_definition(vahControl * ctl, const char *xmlStr) goto exit; } - ctl->def = virDomainDefParseString(ctl->caps, xmlStr, + ctl->def = virDomainDefParseString(ctl->caps, xmlStr, -1, VIR_DOMAIN_XML_INACTIVE); if (ctl->def == NULL) { vah_error(ctl, 0, _("could not parse XML")); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 98daca8d7..17eb242db 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -544,10 +544,11 @@ static int testOpenDefault(virConnectPtr conn) { privconn->nextDomID = 1; - if (!(domdef = virDomainDefParseString(privconn->caps, - defaultDomainXML, + if (!(domdef = virDomainDefParseString(privconn->caps, defaultDomainXML, + 1 << VIR_DOMAIN_VIRT_TEST, VIR_DOMAIN_XML_INACTIVE))) goto error; + if (testDomainGenerateIfnames(domdef) < 0) goto error; if (!(domobj = virDomainAssignDef(privconn->caps, @@ -889,12 +890,14 @@ static int testOpenFromFile(virConnectPtr conn, goto error; } def = virDomainDefParseFile(privconn->caps, absFile, + 1 << VIR_DOMAIN_VIRT_TEST, VIR_DOMAIN_XML_INACTIVE); VIR_FREE(absFile); if (!def) goto error; } else { if ((def = virDomainDefParseNode(privconn->caps, xml, domains[i], + 1 << VIR_DOMAIN_VIRT_TEST, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto error; } @@ -1288,6 +1291,7 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, testDriverLock(privconn); if ((def = virDomainDefParseString(privconn->caps, xml, + 1 << VIR_DOMAIN_VIRT_TEST, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; @@ -1868,6 +1872,7 @@ static int testDomainRestore(virConnectPtr conn, testDriverLock(privconn); def = virDomainDefParseString(privconn->caps, xml, + 1 << VIR_DOMAIN_VIRT_TEST, VIR_DOMAIN_XML_INACTIVE); if (!def) goto cleanup; @@ -2416,6 +2421,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn, testDriverLock(privconn); if ((def = virDomainDefParseString(privconn->caps, xml, + 1 << VIR_DOMAIN_VIRT_TEST, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 6a396e4dd..4160ac1ed 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -443,7 +443,8 @@ umlStartup(int privileged) ¨_driver->domains, uml_driver->configDir, uml_driver->autostartDir, - 0, NULL, NULL) < 0) + 0, 1 << VIR_DOMAIN_VIRT_UML, + NULL, NULL) < 0) goto error; umlAutostartConfigs(uml_driver); @@ -480,7 +481,8 @@ umlReload(void) { ¨_driver->domains, uml_driver->configDir, uml_driver->autostartDir, - 0, NULL, NULL); + 0, 1 << VIR_DOMAIN_VIRT_UML, + NULL, NULL); umlAutostartConfigs(uml_driver); umlDriverUnlock(uml_driver); @@ -1273,6 +1275,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml, umlDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_UML, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -1646,6 +1649,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) { umlDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_UML, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 2c48950ee..7003316c1 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -4803,6 +4803,7 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const char *xml) { nsresult rc; if (!(def = virDomainDefParseString(data->caps, xml, + 1 << VIR_DOMAIN_VIRT_VBOX, VIR_DOMAIN_XML_INACTIVE))) { goto cleanup; } diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 3f0cfae65..68afcaf4e 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -255,6 +255,7 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml) vmwareDriverLock(driver); if ((vmdef = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_VMWARE, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; @@ -508,6 +509,7 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, vmwareDriverLock(driver); if ((vmdef = virDomainDefParseString(driver->caps, xml, + 1 << VIR_DOMAIN_VIRT_VMWARE, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 0f6639581..1d75da353 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1325,9 +1325,8 @@ xenUnifiedDomainXMLToNative(virConnectPtr conn, goto cleanup; } - if (!(def = virDomainDefParseString(priv->caps, - xmlData, - 0))) + if (!(def = virDomainDefParseString(priv->caps, xmlData, + 1 << VIR_DOMAIN_VIRT_XEN, 0))) goto cleanup; if (STREQ(format, XEN_CONFIG_FORMAT_XM)) { diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 6c2f05127..e3f8750cc 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -2596,8 +2596,8 @@ xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc, priv = (xenUnifiedPrivatePtr) conn->privateData; - if (!(def = virDomainDefParseString(priv->caps, - xmlDesc, + if (!(def = virDomainDefParseString(priv->caps, xmlDesc, + 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) return (NULL); @@ -3346,6 +3346,7 @@ virDomainPtr xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc) { return(NULL); if (!(def = virDomainDefParseString(priv->caps, xmlDesc, + 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) { virXendError(VIR_ERR_XML_ERROR, "%s", _("failed to parse domain description")); diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index 01b9c4e45..68181d2bf 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -1106,6 +1106,7 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) } if (!(def = virDomainDefParseString(priv->caps, xml, + 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) { xenUnifiedUnlock(priv); return (NULL); diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index 1c06f7591..4496d4aae 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -517,7 +517,9 @@ xenapiDomainCreateXML (virConnectPtr conn, virCheckFlags(0, NULL); - virDomainDefPtr defPtr = virDomainDefParseString(caps, xmlDesc, flags); + virDomainDefPtr defPtr = virDomainDefParseString(caps, xmlDesc, + 1 << VIR_DOMAIN_VIRT_XEN, + flags); createVMRecordFromXml(conn, defPtr, &record, &vm); virDomainDefFree(defPtr); if (record) { @@ -1636,9 +1638,11 @@ xenapiDomainDefineXML (virConnectPtr conn, const char *xml) virCapsPtr caps = ((struct _xenapiPrivate *)(conn->privateData))->caps; if (!caps) return NULL; - virDomainDefPtr defPtr = virDomainDefParseString(caps, xml, 0); + virDomainDefPtr defPtr = virDomainDefParseString(caps, xml, + 1 << VIR_DOMAIN_VIRT_XEN, 0); if (!defPtr) return NULL; + if (createVMRecordFromXml(conn, defPtr, &record, &vm) != 0) { if (!session->ok) xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, NULL); diff --git a/tests/define-dev-segfault b/tests/define-dev-segfault index 19d4e671c..3feff4668 100755 --- a/tests/define-dev-segfault +++ b/tests/define-dev-segfault @@ -17,7 +17,7 @@ fail=0 # Domain definition from Cole Robinson. cat <<\EOF > D.xml || fail=1 - + D aaa3ae22-fed2-bfbd-ac02-3bea3bcfad82 262144 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 56f928812..434264a42 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -14,6 +14,7 @@ # include "testutils.h" # include "qemu/qemu_capabilities.h" # include "qemu/qemu_command.h" +# include "qemu/qemu_domain.h" # include "datatypes.h" # include "cpu/cpu_map.h" @@ -51,6 +52,7 @@ static int testCompareXMLToArgvFiles(const char *xml, expectargv[len - 1] = '\0'; if (!(vmdef = virDomainDefParseFile(driver.caps, xml, + QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) goto fail; diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 2a3e75aec..f22872f6d 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -13,6 +13,7 @@ # include "internal.h" # include "testutils.h" # include "qemu/qemu_conf.h" +# include "qemu/qemu_domain.h" # include "testutilsqemu.h" static struct qemud_driver driver; @@ -32,7 +33,8 @@ testCompareXMLToXMLFiles(const char *inxml, const char *outxml) goto fail; if (!(def = virDomainDefParseString(driver.caps, inXmlData, - VIR_DOMAIN_XML_INACTIVE))) + QEMU_EXPECTED_VIRT_TYPES, + VIR_DOMAIN_XML_INACTIVE))) goto fail; if (!(actual = virDomainDefFormat(def, VIR_DOMAIN_XML_SECURE))) diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c index a15a7ff19..c184b8df0 100644 --- a/tests/xmconfigtest.c +++ b/tests/xmconfigtest.c @@ -68,7 +68,7 @@ testCompareParseXML(const char *xmcfg, const char *xml, int xendConfigVersion) priv.caps = caps; conn->privateData = &priv; - if (!(def = virDomainDefParseString(caps, xmlData, + if (!(def = virDomainDefParseString(caps, xmlData, 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) goto fail; diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c index e068e696a..41712d39a 100644 --- a/tests/xml2sexprtest.c +++ b/tests/xml2sexprtest.c @@ -31,7 +31,7 @@ testCompareFiles(const char *xml, const char *sexpr, int xendConfigVersion) if (virtTestLoadFile(sexpr, &sexprData) < 0) goto fail; - if (!(def = virDomainDefParseString(caps, xmlData, + if (!(def = virDomainDefParseString(caps, xmlData, 1 << VIR_DOMAIN_VIRT_XEN, VIR_DOMAIN_XML_INACTIVE))) goto fail; diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index f1e1b9529..439ddc810 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -80,7 +80,8 @@ testCompareFiles(const char *xml, const char *vmx, int virtualHW_version) goto failure; } - def = virDomainDefParseString(caps, xmlData, VIR_DOMAIN_XML_INACTIVE); + def = virDomainDefParseString(caps, xmlData, 1 << VIR_DOMAIN_VIRT_VMWARE, + VIR_DOMAIN_XML_INACTIVE); if (def == NULL) { goto failure; -- 2.39.5