[libvirt PATCH 3/3] cpu: Fail CPU comparison in the presence of unknown elements.
Peter Krempa
pkrempa at redhat.com
Wed Sep 16 13:43:21 UTC 2020
On Wed, Sep 16, 2020 at 15:33:56 +0200, Tim Wiederhake wrote:
> Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
> ---
> src/conf/cpu_conf.c | 38 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
> diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
> index dea950ce68..a2ba92ced3 100644
> --- a/src/conf/cpu_conf.c
> +++ b/src/conf/cpu_conf.c
> @@ -659,6 +659,44 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
> def->cache->mode = mode;
> }
>
> + g_clear_pointer(&nodes, g_free);
> + if ((n = virXPathNodeSet("./@*", ctxt, &nodes)) < 0)
> + return -1;
> +
> + for (i = 0; i < n; i++) {
> + if (virXMLNodeNameEqual(nodes[i], "check") ||
> + virXMLNodeNameEqual(nodes[i], "match") ||
> + virXMLNodeNameEqual(nodes[i], "migratable") ||
> + virXMLNodeNameEqual(nodes[i], "mode"))
> + continue;
> + virReportError(VIR_ERR_XML_ERROR,
> + _("unrecognized attribute in cpu element: %s"),
> + nodes[i]->name);
> + return -1;
> + }
> +
> + g_clear_pointer(&nodes, g_free);
> + if ((n = virXPathNodeSet("./*", ctxt, &nodes)) < 0)
> + return -1;
> +
> + for (i = 0; i < n; i++) {
> + if (virXMLNodeNameEqual(nodes[i], "arch") ||
> + virXMLNodeNameEqual(nodes[i], "cache") ||
> + virXMLNodeNameEqual(nodes[i], "counter") ||
> + virXMLNodeNameEqual(nodes[i], "feature") ||
> + virXMLNodeNameEqual(nodes[i], "model") ||
> + virXMLNodeNameEqual(nodes[i], "microcode") ||
> + virXMLNodeNameEqual(nodes[i], "numa") ||
> + virXMLNodeNameEqual(nodes[i], "pages") ||
> + virXMLNodeNameEqual(nodes[i], "topology") ||
> + virXMLNodeNameEqual(nodes[i], "vendor"))
> + continue;
> + virReportError(VIR_ERR_XML_ERROR,
> + _("unrecognized element in cpu element: %s"),
> + nodes[i]->name);
NACK this is ugly and unscalable.
Please implement it via RNG schema validation.
More information about the libvir-list
mailing list