On Wed, Sep 16, 2020 at 15:33:56 +0200, Tim Wiederhake wrote: > Signed-off-by: Tim Wiederhake <twiederh@xxxxxxxxxx> > --- > 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.