[libvirt] [PATCH 5/7] domain: Handle seclabel model with an enum
Daniel P. Berrange
berrange at redhat.com
Thu Jan 13 17:23:11 UTC 2011
On Wed, Jan 12, 2011 at 12:23:01PM -0500, Cole Robinson wrote:
> This allows us to explicitly handle the 'default' seclabel case, as
> well as provide easier model validation.
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
> src/conf/domain_conf.c | 38 ++++++++++++++++++++++++++++++--------
> src/conf/domain_conf.h | 14 ++++++++++++--
> src/security/security_apparmor.c | 9 +++------
> src/security/security_driver.c | 15 ++++++++++-----
> src/security/security_selinux.c | 8 ++------
> 5 files changed, 57 insertions(+), 27 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 8f6ef55..077a396 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -313,6 +313,12 @@ VIR_ENUM_IMPL(virDomainSeclabel, VIR_DOMAIN_SECLABEL_LAST,
> "dynamic",
> "static")
>
> +VIR_ENUM_IMPL(virDomainSeclabelModel, VIR_DOMAIN_SECLABEL_MODEL_LAST,
> + "default",
> + "selinux",
> + "apparmor",
> + "none")
If we remove 'none' from the enum, this is ok.
> +
> VIR_ENUM_IMPL(virDomainNetdevMacvtap, VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
> "vepa",
> "private",
> @@ -759,7 +765,7 @@ void virDomainSeclabelDefClear(virSecurityLabelDefPtr seclabel)
> if (!seclabel)
> return;
>
> - VIR_FREE(seclabel->model);
> + seclabel->model = VIR_DOMAIN_SECLABEL_MODEL_DEFAULT;
> VIR_FREE(seclabel->label);
> VIR_FREE(seclabel->imagelabel);
> }
> @@ -4244,7 +4250,15 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
> "%s", _("missing security model"));
> goto error;
> }
> - def->seclabel.model = p;
> +
> + def->seclabel.model = virDomainSeclabelModelTypeFromString(p);
> + if (def->seclabel.model < 0) {
> + virDomainReportError(VIR_ERR_XML_ERROR,
> + _("unknown security model '%s'"), p);
> + VIR_FREE(p);
> + goto error;
> + }
> + VIR_FREE(p);
>
> p = virXPathStringLimit("string(./seclabel/label[1])",
> VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
> @@ -7336,18 +7350,26 @@ char *virDomainDefFormat(virDomainDefPtr def,
>
> virBufferAddLit(&buf, " </devices>\n");
>
> - if (def->seclabel.model) {
> - const char *sectype = virDomainSeclabelTypeToString(def->seclabel.type);
> + if (def->seclabel.model != VIR_DOMAIN_SECLABEL_MODEL_DEFAULT) {
> + const char *sectype, *secmodel;
> +
> + sectype = virDomainSeclabelTypeToString(def->seclabel.type);
> if (!sectype)
> goto cleanup;
> +
> + secmodel = virDomainSeclabelModelTypeToString(def->seclabel.model);
> + if (!secmodel)
> + goto cleanup;
> +
> + virBufferVSprintf(&buf, " <seclabel type='%s' model='%s'",
> + sectype, secmodel);
> +
> if (!def->seclabel.label ||
> (def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC &&
> (flags & VIR_DOMAIN_XML_INACTIVE))) {
> - virBufferVSprintf(&buf, " <seclabel type='%s' model='%s'/>\n",
> - sectype, def->seclabel.model);
> + virBufferAddLit(&buf, "/>\n");
> } else {
> - virBufferVSprintf(&buf, " <seclabel type='%s' model='%s'>\n",
> - sectype, def->seclabel.model);
> + virBufferAddLit(&buf, ">\n");
> virBufferEscapeString(&buf, " <label>%s</label>\n",
> def->seclabel.label);
> if (def->seclabel.imagelabel &&
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index b5cf433..81409f8 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -782,14 +782,23 @@ enum virDomainSeclabelType {
> VIR_DOMAIN_SECLABEL_LAST,
> };
>
> +enum virDomainSeclabelModel {
> + VIR_DOMAIN_SECLABEL_MODEL_DEFAULT,
> + VIR_DOMAIN_SECLABEL_MODEL_SELINUX,
> + VIR_DOMAIN_SECLABEL_MODEL_APPARMOR,
> + VIR_DOMAIN_SECLABEL_MODEL_NONE,
> +
> + VIR_DOMAIN_SECLABEL_MODEL_LAST,
> +};
Remove NONE here too.
ACK, if the 'none' / NONE bits are removed.
Daniel
More information about the libvir-list
mailing list