[libvirt] [PATCH] seclabel: fix regression in libvirtd restart
Daniel Veillard
veillard at redhat.com
Thu Jan 5 09:18:51 UTC 2012
On Wed, Jan 04, 2012 at 04:01:24PM -0700, Eric Blake wrote:
> Commit b434329 has a logic bug: seclabel overrides don't set
> def->type, but the default value is 0 (aka static). Restarting
> libvirtd would thus reject the XML for any domain with an
> override of <seclabel relabel='no'/> (which happens quite
> easily if a disk image lives on NFS), with a message:
>
> 2012-01-04 22:29:40.949+0000: 6769: error : virSecurityLabelDefParseXMLHelper:2593 : XML error: security label is missing
>
> Fix the logic to never read from an override's def->type, and
> to allow a missing <label> subelement when relabel is no. There's
> a lot of stupid double-negatives in the code (!norelabel) because
> of the way that we want the zero-initialized defaults to behave.
>
> * src/conf/domain_conf.c (virSecurityLabelDefParseXMLHelper): Use
> type field from correct location.
> ---
> src/conf/domain_conf.c | 16 +++++++++-------
> 1 files changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 29966f1..dcf23fa 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1,7 +1,7 @@
> /*
> * domain_conf.c: domain XML processing
> *
> - * Copyright (C) 2006-2011 Red Hat, Inc.
> + * Copyright (C) 2006-2012 Red Hat, Inc.
> * Copyright (C) 2006-2008 Daniel P. Berrange
> *
> * This library is free software; you can redistribute it and/or
> @@ -2541,6 +2541,7 @@ virSecurityLabelDefParseXMLHelper(virSecurityLabelDefPtr def,
> char *p;
> xmlNodePtr save_ctxt = ctxt->node;
> int ret = -1;
> + int type = default_seclabel ? default_seclabel->type : def->type;
>
> ctxt->node = node;
>
> @@ -2567,14 +2568,15 @@ virSecurityLabelDefParseXMLHelper(virSecurityLabelDefPtr def,
> }
> VIR_FREE(p);
> if (!default_seclabel &&
> - def->type == VIR_DOMAIN_SECLABEL_DYNAMIC &&
> + type == VIR_DOMAIN_SECLABEL_DYNAMIC &&
> def->norelabel) {
> - virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> - "%s", _("dynamic label type must use resource relabeling"));
> + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("dynamic label type must use resource "
> + "relabeling"));
> goto cleanup;
> }
> } else {
> - if (!default_seclabel && def->type == VIR_DOMAIN_SECLABEL_STATIC)
> + if (!default_seclabel && type == VIR_DOMAIN_SECLABEL_STATIC)
> def->norelabel = true;
> else
> def->norelabel = false;
> @@ -2583,12 +2585,12 @@ virSecurityLabelDefParseXMLHelper(virSecurityLabelDefPtr def,
> /* Only parse label, if using static labels, or
> * if the 'live' VM XML is requested, or if this is a device override
> */
> - if (def->type == VIR_DOMAIN_SECLABEL_STATIC ||
> + if (type == VIR_DOMAIN_SECLABEL_STATIC ||
> !(flags & VIR_DOMAIN_XML_INACTIVE) ||
> (default_seclabel && !def->norelabel)) {
> p = virXPathStringLimit("string(./label[1])",
> VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
> - if (p == NULL) {
> + if (p == NULL && !(default_seclabel && def->norelabel)) {
> virDomainReportError(VIR_ERR_XML_ERROR,
> "%s", _("security label is missing"));
> goto cleanup;
ACK and pushed since I wanted to include it in rc2,
thanks,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list