[libvirt] [PATCH] cpu: Fail when CPU type cannot be detected from XML

When autodetecting whether XML describes guest or host CPU, the presence of <arch> element is checked. If it's present, we treat the XML as host CPU definition. Which is right, since guest CPU definitions do not contain <arch> element. However, if at the same time the root <cpu> element contains `match' attribute, we would silently ignore it and still treat the XML as host CPU. We should rather refuse such invalid XML. --- src/conf/cpu_conf.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index d9aa69c..35bcce8 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -130,9 +130,15 @@ virCPUDefParseXML(const xmlNodePtr node, } if (mode == VIR_CPU_TYPE_AUTO) { - if (virXPathBoolean("boolean(./arch)", ctxt)) + if (virXPathBoolean("boolean(./arch)", ctxt)) { + if (virXPathBoolean("boolean(./@match)", ctxt)) { + virCPUReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("'arch' element element cannot be used inside 'cpu'" + " element with 'match' attribute'")); + goto error; + } def->type = VIR_CPU_TYPE_HOST; - else + } else def->type = VIR_CPU_TYPE_GUEST; } else def->type = mode; -- 1.7.1.1

On Mon, Jul 12, 2010 at 05:49:53PM +0200, Jiri Denemark wrote:
When autodetecting whether XML describes guest or host CPU, the presence of <arch> element is checked. If it's present, we treat the XML as host CPU definition. Which is right, since guest CPU definitions do not contain <arch> element. However, if at the same time the root <cpu> element contains `match' attribute, we would silently ignore it and still treat the XML as host CPU. We should rather refuse such invalid XML. --- src/conf/cpu_conf.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index d9aa69c..35bcce8 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -130,9 +130,15 @@ virCPUDefParseXML(const xmlNodePtr node, }
if (mode == VIR_CPU_TYPE_AUTO) { - if (virXPathBoolean("boolean(./arch)", ctxt)) + if (virXPathBoolean("boolean(./arch)", ctxt)) { + if (virXPathBoolean("boolean(./@match)", ctxt)) { + virCPUReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("'arch' element element cannot be used inside 'cpu'" + " element with 'match' attribute'")); + goto error; + } def->type = VIR_CPU_TYPE_HOST; - else + } else def->type = VIR_CPU_TYPE_GUEST; } else def->type = mode;
except since it's user provided data, we should use error VIR_ERR_XML_ERROR instead of VIR_ERR_INTERNAL_ERROR, ACK, once that is fixed Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index d9aa69c..35bcce8 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -130,9 +130,15 @@ virCPUDefParseXML(const xmlNodePtr node, }
if (mode == VIR_CPU_TYPE_AUTO) { - if (virXPathBoolean("boolean(./arch)", ctxt)) + if (virXPathBoolean("boolean(./arch)", ctxt)) { + if (virXPathBoolean("boolean(./@match)", ctxt)) { + virCPUReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("'arch' element element cannot be used inside 'cpu'" + " element with 'match' attribute'")); + goto error; + } def->type = VIR_CPU_TYPE_HOST; - else + } else def->type = VIR_CPU_TYPE_GUEST; } else def->type = mode;
except since it's user provided data, we should use error VIR_ERR_XML_ERROR instead of VIR_ERR_INTERNAL_ERROR,
ACK, once that is fixed
OK, I fixed the error code and pushed. Jirka
participants (2)
-
Daniel Veillard
-
Jiri Denemark