[libvirt] [PATCH 03/41] cpu: Detect arch when parsing CPU data
Peter Krempa
pkrempa at redhat.com
Wed Jun 8 12:36:30 UTC 2016
On Wed, Jun 08, 2016 at 10:22:17 +0200, Jiri Denemark wrote:
> A CPU data XML file already contains the architecture, let the parser
> use it to detect which CPU driver should be used to parse the rest of
> the file.
>
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> src/cpu/cpu.c | 54 ++++++++++++++++++++++++++++++++++++++++++++----------
> src/cpu/cpu.h | 7 +++----
> src/cpu/cpu_x86.c | 15 ++-------------
> 3 files changed, 49 insertions(+), 27 deletions(-)
>
> diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
> index dbd0987..8c3d39d 100644
> --- a/src/cpu/cpu.c
> +++ b/src/cpu/cpu.c
[...]
> @@ -675,24 +689,44 @@ cpuDataFormat(const virCPUData *data)
> * Returns internal CPU data structure parsed from the XML or NULL on error.
> */
> virCPUDataPtr
> -cpuDataParse(virArch arch,
> - const char *xmlStr)
> +cpuDataParse(const char *xmlStr)
> {
> struct cpuArchDriver *driver;
> + xmlDocPtr xml = NULL;
> + xmlXPathContextPtr ctxt = NULL;
> + virCPUDataPtr data = NULL;
> + char *arch;
'arch' can be freed uninitialized.
>
> - VIR_DEBUG("arch=%s, xmlStr=%s", virArchToString(arch), xmlStr);
> + VIR_DEBUG("xmlStr=%s", xmlStr);
>
> - if (!(driver = cpuGetSubDriver(arch)))
> - return NULL;
> + if (!(xml = virXMLParseStringCtxt(xmlStr, _("CPU data"), &ctxt))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("cannot parse CPU data"));
> + goto cleanup;
> + }
> +
> + if (!(arch = virXPathString("string(/cpudata/@arch)", ctxt))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("missing CPU data architecture"));
> + goto cleanup;
> + }
> +
> + if (!(driver = cpuGetSubDriverByName(arch)))
> + goto cleanup;
This doesn't report errors.
>
> if (!driver->dataParse) {
> virReportError(VIR_ERR_NO_SUPPORT,
> - _("cannot parse %s CPU data"),
> - virArchToString(arch));
> - return NULL;
> + _("cannot parse %s CPU data"), arch);
> + goto cleanup;
> }
>
> - return driver->dataParse(xmlStr);
> + data = driver->dataParse(ctxt);
> +
> + cleanup:
> + xmlXPathFreeContext(ctxt);
> + xmlFreeDoc(xml);
> + VIR_FREE(arch);
^^^^
> + return data;
> }
>
> bool
ACK with the two problems fixed.
More information about the libvir-list
mailing list