1
0

virDomainDefSetMetadata: Rework memory handling

Switch to use g_autoptr for 'doc' and 'new' local variables.
Additionally report proper error when 'xmlAddChild' fails because OOM is
not the only error it can report.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
This commit is contained in:
Peter Krempa 2021-02-24 10:46:59 +01:00
parent e2ac76f707
commit c7dc99e84f

View File

@ -30422,15 +30422,14 @@ virDomainDefSetMetadata(virDomainDefPtr def,
const char *key, const char *key,
const char *uri) const char *uri)
{ {
xmlDocPtr doc = NULL; g_autoptr(xmlDoc) doc = NULL;
xmlNodePtr old; xmlNodePtr old;
xmlNodePtr new = NULL; g_autoptr(xmlNode) new = NULL;
int ret = -1;
if (type >= VIR_DOMAIN_METADATA_LAST) { if (type >= VIR_DOMAIN_METADATA_LAST) {
virReportError(VIR_ERR_INVALID_ARG, virReportError(VIR_ERR_INVALID_ARG,
_("unknown metadata type '%d'"), type); _("unknown metadata type '%d'"), type);
goto cleanup; return -1;
} }
switch ((virDomainMetadataType) type) { switch ((virDomainMetadataType) type) {
@ -30450,23 +30449,24 @@ virDomainDefSetMetadata(virDomainDefPtr def,
case VIR_DOMAIN_METADATA_ELEMENT: case VIR_DOMAIN_METADATA_ELEMENT:
if (metadata) { if (metadata) {
/* parse and modify the xml from the user */ /* parse and modify the xml from the user */
if (!(doc = virXMLParseString(metadata, _("(metadata_xml)")))) if (!(doc = virXMLParseString(metadata, _("(metadata_xml)"))))
goto cleanup; return -1;
if (virXMLInjectNamespace(doc->children, uri, key) < 0) if (virXMLInjectNamespace(doc->children, uri, key) < 0)
goto cleanup; return -1;
/* create the root node if needed */ /* create the root node if needed */
if (!def->metadata && if (!def->metadata &&
!(def->metadata = xmlNewNode(NULL, (unsigned char *)"metadata"))) { !(def->metadata = xmlNewNode(NULL, (unsigned char *)"metadata"))) {
virReportOOMError(); virReportOOMError();
goto cleanup; return -1;
} }
if (!(new = xmlCopyNode(doc->children, 1))) { if (!(new = xmlCopyNode(doc->children, 1))) {
virReportOOMError(); virReportOOMError();
goto cleanup; return -1;
} }
} }
@ -30476,11 +30476,13 @@ virDomainDefSetMetadata(virDomainDefPtr def,
xmlFreeNode(old); xmlFreeNode(old);
} }
if (new && if (new) {
!(xmlAddChild(def->metadata, new))) { if (!(xmlAddChild(def->metadata, new))) {
xmlFreeNode(new); virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
virReportOOMError(); _("failed to add metadata to XML document"));
goto cleanup; return -1;
}
new = NULL;
} }
break; break;
@ -30489,11 +30491,7 @@ virDomainDefSetMetadata(virDomainDefPtr def,
break; break;
} }
ret = 0; return 0;
cleanup:
xmlFreeDoc(doc);
return ret;
} }