On Wed, Jun 08, 2016 at 14:36:30 +0200, Peter Krempa wrote:
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(a)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.
Oops, cpuGetSubDriverByName in this patch cannot even return NULL since
it wrongly fallbacks to a default driver. I removed the fallback and let
cpuGetSubDriverByName report a proper error.
Jirka