On 05/09/2013 08:59 AM, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
[...snip...]
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index 89b038c..8b7dec9 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -1294,18 +1294,31 @@ static char *
xenUnifiedDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
{
xenUnifiedPrivatePtr priv = dom->conn->privateData;
+ virDomainDefPtr minidef = NULL;
+ virDomainDefPtr def = NULL;
+ char *ret = NULL;
+
+ if (!(minidef = xenGetDomainDefForDom(dom)))
+ goto cleanup;
if (dom->id < 0 && priv->xendConfigVersion <
XEND_CONFIG_VERSION_3_0_4) {
- return xenXMDomainGetXMLDesc(dom, flags);
+ def = xenXMDomainGetXMLDesc(dom->conn, minidef);
} else {
- char *cpus, *res;
+ char *cpus;
xenUnifiedLock(priv);
cpus = xenDomainUsedCpus(dom);
xenUnifiedUnlock(priv);
- res = xenDaemonDomainGetXMLDesc(dom, flags, cpus);
+ def = xenDaemonDomainGetXMLDesc(dom->conn, minidef, cpus);
VIR_FREE(cpus);
- return res;
}
+
+ if (def)
+ ret = virDomainDefFormat(def, flags);
+
+cleanup:
+ virDomainDefFree(def);
+ virDomainDefFree(minidef);
+ return ret;
}
@@ -1438,10 +1451,21 @@ xenUnifiedDomainMigratePerform(virDomainPtr dom,
const char *dname,
unsigned long resource)
{
+ virDomainDefPtr def = NULL;
+ int ret = -1;
+
virCheckFlags(XEN_MIGRATION_FLAGS, -1);
- return xenDaemonDomainMigratePerform(dom, cookie, cookielen, uri,
- flags, dname, resource);
+ if (!(def = xenGetDomainDefForDom(dom)))
+ goto cleanup;
+
+ ret = xenDaemonDomainMigratePerform(dom->conn, def,
+ cookie, cookielen, uri,
+ flags, dname, resource);
+
+cleanup:
+ virDomainDefFree(def);
+ return ret;
}
static virDomainPtr
@@ -1452,45 +1476,37 @@ xenUnifiedDomainMigrateFinish(virConnectPtr dconn,
const char *uri ATTRIBUTE_UNUSED,
unsigned long flags)
{
- virDomainPtr dom = NULL;
- char *domain_xml = NULL;
- virDomainPtr dom_new = NULL;
+ xenUnifiedPrivatePtr priv = dconn->privateData;
+ virDomainPtr ret = NULL;
+ virDomainDefPtr minidef = NULL;
+ virDomainDefPtr def = NULL;
virCheckFlags(XEN_MIGRATION_FLAGS, NULL);
- if (!(dom = xenUnifiedDomainLookupByName(dconn, dname)))
- return NULL;
+ if (!(minidef = xenGetDomainDefForName(dconn, dname)))
+ goto cleanup;
if (flags & VIR_MIGRATE_PERSIST_DEST) {
- domain_xml = xenDaemonDomainGetXMLDesc(dom, 0, NULL);
- if (! domain_xml) {
- virReportError(VIR_ERR_MIGRATE_PERSIST_FAILED,
- "%s", _("failed to get XML representation of
migrated domain"));
- goto error;
- }
+ if (!(def = xenDaemonDomainGetXMLDesc(dconn, minidef, NULL)))
+ goto cleanup;
- dom_new = xenDaemonDomainDefineXML(dconn, domain_xml);
- if (! dom_new) {
- virReportError(VIR_ERR_MIGRATE_PERSIST_FAILED,
- "%s", _("failed to define domain on
destination host"));
- goto error;
+ if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
+ if (xenXMDomainDefineXML(dconn, def) < 0)
+ goto cleanup;
+ } else {
+ if (xenDaemonDomainDefineXML(dconn, def) < 0)
+ goto cleanup;
}
-
- /* Free additional reference added by Define */
- virDomainFree(dom_new);
}
- VIR_FREE(domain_xml);
-
- return dom;
-
+ ret = virGetDomain(dconn, minidef->name, minidef->uuid);
+ if (ret)
+ ret->id = minidef->id;
-error:
- virDomainFree(dom);
-
- VIR_FREE(domain_xml);
-
- return NULL;
+cleanup:
+ virDomainDefFree(def);
+ virDomainDefFree(minidef);
+ return ret;
}
static int
@@ -1565,23 +1581,52 @@ static virDomainPtr
xenUnifiedDomainDefineXML(virConnectPtr conn, const char *xml)
{
xenUnifiedPrivatePtr priv = conn->privateData;
+ virDomainDefPtr def = NULL;
+ virDomainPtr ret = NULL;
- if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
- return xenXMDomainDefineXML(conn, xml);
- else
- return xenDaemonDomainDefineXML(conn, xml);
+ if (!(def = virDomainDefParseString(xml, priv->caps, priv->xmlopt,
+ 1 << VIR_DOMAIN_VIRT_XEN,
+ VIR_DOMAIN_XML_INACTIVE)))
+ goto cleanup;
+
+ if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
+ if (xenXMDomainDefineXML(conn, def) < 0)
+ goto cleanup;
+ def = NULL; /* XM driver owns it now */
+ } else {
+ if (xenDaemonDomainDefineXML(conn, def) < 0)
+ goto cleanup;
+ }
+
+ ret = virGetDomain(conn, def->name, def->uuid);
+ if (ret)
+ ret->id = -1;
+
Coverity complains
1666
(7) Event var_deref_op: Dereferencing null pointer "def".
Also see events: [assign_zero]
Because of :
1660 goto cleanup;
(4) Event assign_zero: Assigning: "def" = "NULL".
Also see events: [var_deref_op]
1661 def = NULL; /* XM driver owns it now */
(5) Event if_fallthrough: Falling through to end of if statement
1662 } else {
+cleanup:
+ virDomainDefFree(def);
+ return ret;
}
static int
xenUnifiedDomainUndefineFlags(virDomainPtr dom, unsigned int flags)
{
xenUnifiedPrivatePtr priv = dom->conn->privateData;
+ virDomainDefPtr def = NULL;
+ int ret = -1;
virCheckFlags(0, -1);
+
+ if (!(def = xenGetDomainDefForDom(dom)))
+ goto cleanup;
+
if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
- return xenXMDomainUndefine(dom);
+ ret = xenXMDomainUndefine(dom->conn, def);
else
- return xenDaemonDomainUndefine(dom);
+ ret = xenDaemonDomainUndefine(dom->conn, def);
+
+cleanup:
+ virDomainDefFree(def);
+ return ret;
}
static int
[...snip...]