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 2315c98028..3cf7f44217 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 0af6d5b093..8262d25e92 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 f68ede0b20..ddb8c23bae 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 586d562045..21a343e97f 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 31c7d4fd4f..346edef18c 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 799a5e71a4..2ce1fb9a97 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 2c6c870ee3..c1d91e4683 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 d1ab5b42b8..f6f55c4050 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 f282df2780..d78c4b4c55 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 a05a1ee992..1356c54e76 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 3e4f4feb37..1bca4b832e 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 afc0d3337c..fb54dc5e19 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 98daca8d7e..17eb242db9 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 6a396e4dd6..4160ac1edc 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 2c48950eed..7003316c1b 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 3f0cfae65b..68afcaf4ed 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 0f66395813..1d75da3538 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 6c2f05127a..e3f8750cc5 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 01b9c4e450..68181d2bf3 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 1c06f75917..4496d4aae6 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 19d4e671ca..3feff4668b 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 56f928812e..434264a428 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 2a3e75aecb..f22872f6d9 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 a15a7ff193..c184b8df01 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 e068e696a1..41712d39a6 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 f1e1b9529a..439ddc8105 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;