diff --git a/src/conf/checkpoint_conf.c b/src/conf/checkpoint_conf.c index a3513aaa65..113d85cc14 100644 --- a/src/conf/checkpoint_conf.c +++ b/src/conf/checkpoint_conf.c @@ -227,11 +227,8 @@ virDomainCheckpointDefParseNode(xmlDocPtr xml, if (virXMLValidateAgainstSchema(schema, xml) < 0) return NULL; - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virDomainCheckpointDefParse(ctxt, caps, xmlopt, parseOpaque, flags); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 848c831330..e5e3f31f76 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -21575,11 +21575,8 @@ virDomainDefParseNode(xmlDocPtr xml, virDomainDefPtr def = NULL; virDomainDefPtr ret = NULL; - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; @@ -21621,10 +21618,8 @@ virDomainObjParseNode(xmlDocPtr xml, goto cleanup; } - if (!(ctxt = xmlXPathNewContext(xml))) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; obj = virDomainObjParseXML(xml, ctxt, caps, xmlopt, flags); diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index b134ff4adc..64729aea43 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -830,11 +830,8 @@ virInterfaceDefParseNode(xmlDocPtr xml, return NULL; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virInterfaceDefParseXML(ctxt, VIR_INTERFACE_TYPE_LAST); diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index aa0d48af8f..585c87a9f4 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2125,11 +2125,8 @@ virNetworkDefParseNode(xmlDocPtr xml, return NULL; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virNetworkDefParseXML(ctxt, xmlopt); diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 618ce8e00e..8f8830aef1 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -2063,11 +2063,8 @@ virNodeDeviceDefParseNode(xmlDocPtr xml, return NULL; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virNodeDeviceDefParseXML(ctxt, create, virt_type); diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index cecee51d87..21885eb7ae 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -2756,11 +2756,8 @@ virNWFilterDefParseNode(xmlDocPtr xml, goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virNWFilterDefParseXML(ctxt); diff --git a/src/conf/secret_conf.c b/src/conf/secret_conf.c index b291339e77..a7691da7b5 100644 --- a/src/conf/secret_conf.c +++ b/src/conf/secret_conf.c @@ -144,11 +144,9 @@ secretXMLParseNode(xmlDocPtr xml, xmlNodePtr root) goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } + ctxt->node = root; if (VIR_ALLOC(def) < 0) diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index cce9a7999c..8cf80aed83 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -450,11 +450,8 @@ virDomainSnapshotDefParseNode(xmlDocPtr xml, goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virDomainSnapshotDefParse(ctxt, caps, xmlopt, parseOpaque, current, flags); diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 024f047fab..0560994281 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1024,11 +1024,8 @@ virStoragePoolDefParseNode(xmlDocPtr xml, goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virStoragePoolDefParseXML(ctxt); @@ -1468,11 +1465,8 @@ virStorageVolDefParseNode(virStoragePoolDefPtr pool, goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virStorageVolDefParseXML(pool, ctxt, flags); diff --git a/src/conf/virnetworkportdef.c b/src/conf/virnetworkportdef.c index 29ecf5b178..2e20bff66e 100644 --- a/src/conf/virnetworkportdef.c +++ b/src/conf/virnetworkportdef.c @@ -277,11 +277,8 @@ virNetworkPortDefParseNode(xmlDocPtr xml, goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virNetworkPortDefParseXML(ctxt); diff --git a/src/conf/virnwfilterbindingdef.c b/src/conf/virnwfilterbindingdef.c index facca61833..6f13bc581a 100644 --- a/src/conf/virnwfilterbindingdef.c +++ b/src/conf/virnwfilterbindingdef.c @@ -182,11 +182,8 @@ virNWFilterBindingDefParseNode(xmlDocPtr xml, goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } ctxt->node = root; def = virNWFilterBindingDefParseXML(ctxt); diff --git a/src/conf/virnwfilterbindingobj.c b/src/conf/virnwfilterbindingobj.c index 68afb9c434..06dd66a5d1 100644 --- a/src/conf/virnwfilterbindingobj.c +++ b/src/conf/virnwfilterbindingobj.c @@ -248,11 +248,8 @@ virNWFilterBindingObjParseNode(xmlDocPtr doc, goto cleanup; } - ctxt = xmlXPathNewContext(doc); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(doc))) goto cleanup; - } ctxt->node = root; obj = virNWFilterBindingObjParseXML(doc, ctxt); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9510686ebf..39812227aa 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3365,6 +3365,7 @@ virXMLValidateAgainstSchema; virXMLValidatorFree; virXMLValidatorInit; virXMLValidatorValidate; +virXMLXPathContextNew; virXPathBoolean; virXPathContextNodeRestore; virXPathInt; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a7575fcd8b..43f01bf2ba 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3611,10 +3611,8 @@ virQEMUCapsLoadCache(virArch hostArch, if (!(doc = virXMLParseFile(filename))) goto cleanup; - if (!(ctxt = xmlXPathNewContext(doc))) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(doc))) goto cleanup; - } ctxt->node = xmlDocGetRootElement(doc); diff --git a/src/util/virxml.c b/src/util/virxml.c index f9c117dd58..245ca0a752 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -46,6 +46,20 @@ struct virParserData { }; +xmlXPathContextPtr +virXMLXPathContextNew(xmlDocPtr xml) +{ + xmlXPathContextPtr ctxt; + + if (!(ctxt = xmlXPathNewContext(xml))) { + virReportOOMError(); + return NULL; + } + + return ctxt; +} + + /** * virXPathString: * @xpath: the XPath string to evaluate @@ -824,11 +838,9 @@ virXMLParseHelper(int domcode, } if (ctxt) { - *ctxt = xmlXPathNewContext(xml); - if (!*ctxt) { - virReportOOMError(); + if (!(*ctxt = virXMLXPathContextNew(xml))) goto error; - } + (*ctxt)->node = xmlDocGetRootElement(xml); } diff --git a/src/util/virxml.h b/src/util/virxml.h index 30cc895436..39e5a988a2 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -30,6 +30,9 @@ #include "virbuffer.h" #include "virautoclean.h" +xmlXPathContextPtr virXMLXPathContextNew(xmlDocPtr xml) + ATTRIBUTE_RETURN_CHECK; + int virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt); char * virXPathString(const char *xpath, diff --git a/src/vbox/vbox_snapshot_conf.c b/src/vbox/vbox_snapshot_conf.c index a36da30a4f..a6daf0ffcf 100644 --- a/src/vbox/vbox_snapshot_conf.c +++ b/src/vbox/vbox_snapshot_conf.c @@ -615,10 +615,9 @@ virVBoxSnapshotConfLoadVboxFile(const char *filePath, _("Unable to parse the xml")); goto cleanup; } - if (!(xPathContext = xmlXPathNewContext(xml))) { - virReportOOMError(); + if (!(xPathContext = virXMLXPathContextNew(xml))) goto cleanup; - } + if (xmlXPathRegisterNs(xPathContext, BAD_CAST "vbox", BAD_CAST "http://www.innotek.de/VirtualBox-settings") < 0) { @@ -1299,10 +1298,10 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(const char *filePath, _("Unable to parse the xml")); goto cleanup; } - if (!(xPathContext = xmlXPathNewContext(xml))) { - virReportOOMError(); + + if (!(xPathContext = virXMLXPathContextNew(xml))) goto cleanup; - } + xPathContext->node = xmlDocGetRootElement(xml); if ((nodeSize = virXPathNodeSet("/domainsnapshot/disks/disk", xPathContext, &nodes)) < 0) @@ -1360,10 +1359,10 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(const char *filePath, _("Unable to parse the xml")); goto cleanup; } - if (!(xPathContext = xmlXPathNewContext(xml))) { - virReportOOMError(); + + if (!(xPathContext = virXMLXPathContextNew(xml))) goto cleanup; - } + xPathContext->node = xmlDocGetRootElement(xml); if ((nodeSize = virXPathNodeSet("/domainsnapshot/domain/devices/disk", xPathContext, diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 478443298f..c6e3398620 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -4674,11 +4674,9 @@ prlsdkParseSnapshotTree(const char *treexml) goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); + if (!(ctxt = virXMLXPathContextNew(xml))) goto cleanup; - } + ctxt->node = root; if ((n = virXPathNodeSet("//SavedStateItem", ctxt, &nodes)) < 0) {