qemu: Use g_autofree in virQEMUCapsLoadCPUModels

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Jiri Denemark 2019-09-24 14:55:26 +02:00
parent ffcb39cbc1
commit 7f091cb6ed

View File

@ -3464,15 +3464,10 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
virDomainVirtType type) virDomainVirtType type)
{ {
virDomainCapsCPUModelsPtr cpus = NULL; virDomainCapsCPUModelsPtr cpus = NULL;
xmlNodePtr *nodes = NULL; g_autofree xmlNodePtr * nodes = NULL;
char *str = NULL;
size_t i; size_t i;
int n; int n;
int ret = -1;
xmlNodePtr node; xmlNodePtr node;
xmlNodePtr *blockerNodes = NULL;
char **blockers = NULL;
int nblockers;
if (type == VIR_DOMAIN_VIRT_KVM) if (type == VIR_DOMAIN_VIRT_KVM)
n = virXPathNodeSet("./cpu[@type='kvm']", ctxt, &nodes); n = virXPathNodeSet("./cpu[@type='kvm']", ctxt, &nodes);
@ -3482,16 +3477,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
if (n < 0) { if (n < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to parse qemu capabilities cpus")); _("failed to parse qemu capabilities cpus"));
goto cleanup; return -1;
} }
if (n == 0) { if (n == 0)
ret = 0; return 0;
goto cleanup;
}
if (!(cpus = virDomainCapsCPUModelsNew(n))) if (!(cpus = virDomainCapsCPUModelsNew(n)))
goto cleanup; return -1;
if (type == VIR_DOMAIN_VIRT_KVM) if (type == VIR_DOMAIN_VIRT_KVM)
qemuCaps->kvmCPUModels = cpus; qemuCaps->kvmCPUModels = cpus;
@ -3500,19 +3493,24 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
g_autofree char * strUsable = NULL;
g_autofree char * name = NULL;
g_autofree xmlNodePtr * blockerNodes = NULL;
VIR_AUTOSTRINGLIST blockers = NULL;
int nblockers;
if ((str = virXMLPropString(nodes[i], "usable")) && if ((strUsable = virXMLPropString(nodes[i], "usable")) &&
(usable = virDomainCapsCPUUsableTypeFromString(str)) < 0) { (usable = virDomainCapsCPUUsableTypeFromString(strUsable)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown value '%s' in attribute 'usable'"), str); _("unknown value '%s' in attribute 'usable'"),
goto cleanup; strUsable);
return -1;
} }
VIR_FREE(str);
if (!(str = virXMLPropString(nodes[i], "name"))) { if (!(name = virXMLPropString(nodes[i], "name"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing cpu name in QEMU capabilities cache")); _("missing cpu name in QEMU capabilities cache"));
goto cleanup; return -1;
} }
node = ctxt->node; node = ctxt->node;
@ -3523,38 +3521,30 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps,
if (nblockers < 0) { if (nblockers < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to parse CPU blockers in QEMU capabilities")); _("failed to parse CPU blockers in QEMU capabilities"));
goto cleanup; return -1;
} }
if (nblockers > 0) { if (nblockers > 0) {
size_t j; size_t j;
if (VIR_ALLOC_N(blockers, nblockers + 1) < 0) if (VIR_ALLOC_N(blockers, nblockers + 1) < 0)
goto cleanup; return -1;
for (j = 0; j < nblockers; j++) { for (j = 0; j < nblockers; j++) {
if (!(blockers[j] = virXMLPropString(blockerNodes[j], "name"))) { if (!(blockers[j] = virXMLPropString(blockerNodes[j], "name"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing blocker name in QEMU " _("missing blocker name in QEMU "
"capabilities cache")); "capabilities cache"));
goto cleanup; return -1;
} }
} }
VIR_FREE(blockerNodes);
} }
if (virDomainCapsCPUModelsAddSteal(cpus, &str, usable, &blockers) < 0) if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers) < 0)
goto cleanup; return -1;
} }
ret = 0; return 0;
cleanup:
VIR_FREE(nodes);
VIR_FREE(str);
VIR_FREE(blockerNodes);
virStringListFree(blockers);
return ret;
} }