]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: domain: Invoke post-parse callbacks after parsing private XML parts
authorPeter Krempa <pkrempa@redhat.com>
Mon, 28 May 2018 09:36:45 +0000 (11:36 +0200)
committerJán Tomko <jtomko@redhat.com>
Tue, 29 May 2018 08:23:24 +0000 (10:23 +0200)
When parsing status XML the post-parse callbacks can't access any
private data present in the status XML as the private bits were parsed
after invoking post-parse callbacks.

Move the invocation so that everything is parsed first.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
src/conf/domain_conf.c

index d3102846bd1ee8b21787904444573a36401787e2..d021fbc22b5ef8d141263f18a2be14fd59472034 100644 (file)
@@ -18796,7 +18796,6 @@ virDomainDefParseXML(xmlDocPtr xml,
                      xmlXPathContextPtr ctxt,
                      virCapsPtr caps,
                      virDomainXMLOptionPtr xmlopt,
-                     void *parseOpaque,
                      unsigned int flags)
 {
     xmlNodePtr *nodes = NULL, node = NULL;
@@ -20521,14 +20520,6 @@ virDomainDefParseXML(xmlDocPtr xml,
         (def->ns.parse)(xml, root, ctxt, &def->namespaceData) < 0)
         goto error;
 
-    /* callback to fill driver specific domain aspects */
-    if (virDomainDefPostParse(def, caps, flags, xmlopt, parseOpaque) < 0)
-        goto error;
-
-    /* valdiate configuration */
-    if (virDomainDefValidate(def, caps, flags, xmlopt) < 0)
-        goto error;
-
     return def;
 
  error:
@@ -20568,7 +20559,7 @@ virDomainObjParseXML(xmlDocPtr xml,
 
     oldnode = ctxt->node;
     ctxt->node = config;
-    obj->def = virDomainDefParseXML(xml, config, ctxt, caps, xmlopt, NULL, flags);
+    obj->def = virDomainDefParseXML(xml, config, ctxt, caps, xmlopt, flags);
     ctxt->node = oldnode;
     if (!obj->def)
         goto error;
@@ -20627,6 +20618,14 @@ virDomainObjParseXML(xmlDocPtr xml,
         xmlopt->privateData.parse(ctxt, obj, &xmlopt->config) < 0)
         goto error;
 
+    /* callback to fill driver specific domain aspects */
+    if (virDomainDefPostParse(obj->def, caps, flags, xmlopt, NULL) < 0)
+        goto error;
+
+    /* valdiate configuration */
+    if (virDomainDefValidate(obj->def, caps, flags, xmlopt) < 0)
+        goto error;
+
     return obj;
 
  error:
@@ -20689,6 +20688,7 @@ virDomainDefParseNode(xmlDocPtr xml,
 {
     xmlXPathContextPtr ctxt = NULL;
     virDomainDefPtr def = NULL;
+    virDomainDefPtr ret = NULL;
 
     if (!virXMLNodeNameEqual(root, "domain")) {
         virReportError(VIR_ERR_XML_ERROR,
@@ -20705,11 +20705,24 @@ virDomainDefParseNode(xmlDocPtr xml,
     }
 
     ctxt->node = root;
-    def = virDomainDefParseXML(xml, root, ctxt, caps, xmlopt, parseOpaque, flags);
+
+    if (!(def = virDomainDefParseXML(xml, root, ctxt, caps, xmlopt, flags)))
+        goto cleanup;
+
+    /* callback to fill driver specific domain aspects */
+    if (virDomainDefPostParse(def, caps, flags, xmlopt, parseOpaque) < 0)
+        goto cleanup;
+
+    /* valdiate configuration */
+    if (virDomainDefValidate(def, caps, flags, xmlopt) < 0)
+        goto cleanup;
+
+    VIR_STEAL_PTR(ret, def);
 
  cleanup:
+    virDomainDefFree(def);
     xmlXPathFreeContext(ctxt);
-    return def;
+    return ret;
 }