]> xenbits.xensource.com Git - libvirt.git/commitdiff
Don't autogenerate seclabels of type 'none'
authorJim Fehlig <jfehlig@suse.com>
Wed, 16 Aug 2017 21:46:55 +0000 (15:46 -0600)
committerJim Fehlig <jfehlig@suse.com>
Mon, 21 Aug 2017 15:22:26 +0000 (09:22 -0600)
When security drivers are active but confinement is not enabled,
there is no need to autogenerate <seclabel> elements when starting
a domain def that contains no <seclabel> elements. In fact,
autogenerating the elements can result in needless save/restore and
migration failures when the security driver is not active on the
restore/migration target.

This patch changes the virSecurityManagerGenLabel function in
src/security_manager.c to only autogenerate a <seclabel> element
if none is already defined for the domain *and* default
confinement is enabled. Otherwise the needless <seclabel>
autogeneration is skipped.

Resolves: https://bugzilla.opensuse.org/show_bug.cgi?id=1051017

src/security/security_manager.c

index 013bbc37ef6126f2a6397f98e60d7fe7cec0d3ba..95b9952308fc46bafde54c1c137b35a56f921c12 100644 (file)
@@ -650,31 +650,33 @@ virSecurityManagerGenLabel(virSecurityManagerPtr mgr,
     for (i = 0; sec_managers[i]; i++) {
         generated = false;
         seclabel = virDomainDefGetSecurityLabelDef(vm, sec_managers[i]->drv->name);
-        if (!seclabel) {
-            if (!(seclabel = virSecurityLabelDefNew(sec_managers[i]->drv->name)))
-                goto cleanup;
-            generated = seclabel->implicit = true;
-        }
-
-        if (seclabel->type == VIR_DOMAIN_SECLABEL_DEFAULT) {
-            if (virSecurityManagerGetDefaultConfined(sec_managers[i])) {
-                seclabel->type = VIR_DOMAIN_SECLABEL_DYNAMIC;
+        if (seclabel == NULL) {
+            /* Only generate seclabel if confinement is enabled */
+            if (!virSecurityManagerGetDefaultConfined(sec_managers[i])) {
+                VIR_DEBUG("Skipping auto generated seclabel");
+                continue;
             } else {
-                seclabel->type = VIR_DOMAIN_SECLABEL_NONE;
-                seclabel->relabel = false;
+                if (!(seclabel = virSecurityLabelDefNew(sec_managers[i]->drv->name)))
+                    goto cleanup;
+                generated = seclabel->implicit = true;
+                seclabel->type = VIR_DOMAIN_SECLABEL_DYNAMIC;
+            }
+        } else {
+            if (seclabel->type == VIR_DOMAIN_SECLABEL_DEFAULT) {
+                if (virSecurityManagerGetDefaultConfined(sec_managers[i])) {
+                    seclabel->type = VIR_DOMAIN_SECLABEL_DYNAMIC;
+                } else {
+                    seclabel->type = VIR_DOMAIN_SECLABEL_NONE;
+                    seclabel->relabel = false;
+                }
             }
-        }
 
-        if (seclabel->type == VIR_DOMAIN_SECLABEL_NONE) {
-            if (virSecurityManagerGetRequireConfined(sec_managers[i])) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("Unconfined guests are not allowed on this host"));
-                goto cleanup;
-            } else if (vm->nseclabels && generated) {
-                VIR_DEBUG("Skipping auto generated seclabel of type none");
-                virSecurityLabelDefFree(seclabel);
-                seclabel = NULL;
-                continue;
+            if (seclabel->type == VIR_DOMAIN_SECLABEL_NONE) {
+                if (virSecurityManagerGetRequireConfined(sec_managers[i])) {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                                   _("Unconfined guests are not allowed on this host"));
+                    goto cleanup;
+                }
             }
         }