]> xenbits.xensource.com Git - libvirt.git/commitdiff
security_manager: Load lock plugin on init
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 5 Sep 2018 14:30:15 +0000 (16:30 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 18 Sep 2018 15:12:53 +0000 (17:12 +0200)
Now that we know what metadata lock manager user wishes to use we
can load it when initializing security driver. This is achieved
by adding new argument to virSecurityManagerNewDriver() and
subsequently to all functions that end up calling it.

The cfg.mk change is needed in order to allow lock_manager.h
inclusion in security driver without 'syntax-check' complaining.
This is safe thing to do as locking APIs will always exist (it's
only backend implementation that changes). However, instead of
allowing the include for all other drivers (like cpu, network,
and so on) allow it only for security driver. This will still
trigger the error if including from other drivers.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
cfg.mk
src/lxc/lxc_controller.c
src/lxc/lxc_driver.c
src/qemu/qemu_driver.c
src/security/security_manager.c
src/security/security_manager.h
tests/seclabeltest.c
tests/securityselinuxlabeltest.c
tests/securityselinuxtest.c
tests/testutilsqemu.c

diff --git a/cfg.mk b/cfg.mk
index eddd110ed6665e55c831049ba168c89393f6e4bb..4790d0b7e7ab8caa81231e87a6ce820d575a0b09 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -787,8 +787,10 @@ sc_prohibit_cross_inclusion:
          case $$dir in \
            util/) safe="util";; \
            access/ | conf/) safe="($$dir|conf|util)";; \
-           cpu/| network/| node_device/| rpc/| security/| storage/) \
+           cpu/| network/| node_device/| rpc/| storage/) \
              safe="($$dir|util|conf|storage)";; \
+           security/) \
+             safe="($$dir|util|conf|storage|locking)";; \
            xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \
            *) safe="($$dir|$(mid_dirs)|util)";; \
          esac; \
index 4e84391bf5cf931230b5e28ff7bf054b203bfec9..78556a3d08c291b857f5cb43fcb8e29a091ab276 100644 (file)
@@ -2625,7 +2625,8 @@ int main(int argc, char *argv[])
     ctrl->handshakeFd = handshakeFd;
 
     if (!(ctrl->securityManager = virSecurityManagerNew(securityDriver,
-                                                        LXC_DRIVER_NAME, 0)))
+                                                        LXC_DRIVER_NAME,
+                                                        NULL, 0)))
         goto cleanup;
 
     if (ctrl->def->seclabels) {
index 8867645cdc4214f70a32484398fc2ff8c61bc044..099184524867b73df9b4bba4bf904225cd137798 100644 (file)
@@ -1532,7 +1532,7 @@ lxcSecurityInit(virLXCDriverConfigPtr cfg)
         flags |= VIR_SECURITY_MANAGER_REQUIRE_CONFINED;
 
     virSecurityManagerPtr mgr = virSecurityManagerNew(cfg->securityDriverName,
-                                                      LXC_DRIVER_NAME, flags);
+                                                      LXC_DRIVER_NAME, NULL, flags);
     if (!mgr)
         goto error;
 
index 314c883ea18699ea0956fe5d768477b3937289c5..809c13410cedb73057e8e7598524f14daaee507c 100644 (file)
@@ -355,6 +355,7 @@ qemuSecurityInit(virQEMUDriverPtr driver)
         while (names && *names) {
             if (!(mgr = qemuSecurityNew(*names,
                                         QEMU_DRIVER_NAME,
+                                        cfg->metadataLockManagerName,
                                         flags)))
                 goto error;
             if (!stack) {
@@ -370,6 +371,7 @@ qemuSecurityInit(virQEMUDriverPtr driver)
     } else {
         if (!(mgr = qemuSecurityNew(NULL,
                                     QEMU_DRIVER_NAME,
+                                    cfg->metadataLockManagerName,
                                     flags)))
             goto error;
         if (!(stack = qemuSecurityNewStack(mgr)))
@@ -386,6 +388,7 @@ qemuSecurityInit(virQEMUDriverPtr driver)
                                        cfg->user,
                                        cfg->group,
                                        flags,
+                                       cfg->metadataLockManagerName,
                                        qemuSecurityChownCallback)))
             goto error;
         if (!stack) {
index 9f770d8c535c7cdf9d16729abe7323c163c1f4d7..739d48deaba77c2af988826b39ef9d287f8ac93b 100644 (file)
@@ -28,6 +28,7 @@
 #include "viralloc.h"
 #include "virobject.h"
 #include "virlog.h"
+#include "locking/lock_manager.h"
 
 #define VIR_FROM_THIS VIR_FROM_SECURITY
 
@@ -40,6 +41,8 @@ struct _virSecurityManager {
     unsigned int flags;
     const char *virtDriver;
     void *privateData;
+
+    virLockManagerPluginPtr lockPlugin;
 };
 
 static virClassPtr virSecurityManagerClass;
@@ -50,8 +53,12 @@ void virSecurityManagerDispose(void *obj)
 {
     virSecurityManagerPtr mgr = obj;
 
-    if (mgr->drv->close)
+    if (mgr->drv &&
+        mgr->drv->close)
         mgr->drv->close(mgr);
+
+    virObjectUnref(mgr->lockPlugin);
+
     VIR_FREE(mgr->privateData);
 }
 
@@ -71,6 +78,7 @@ VIR_ONCE_GLOBAL_INIT(virSecurityManager);
 static virSecurityManagerPtr
 virSecurityManagerNewDriver(virSecurityDriverPtr drv,
                             const char *virtDriver,
+                            const char *lockManagerPluginName,
                             unsigned int flags)
 {
     virSecurityManagerPtr mgr = NULL;
@@ -90,6 +98,14 @@ virSecurityManagerNewDriver(virSecurityDriverPtr drv,
     if (!(mgr = virObjectLockableNew(virSecurityManagerClass)))
         goto error;
 
+    if (!lockManagerPluginName)
+        lockManagerPluginName = "nop";
+
+    if (!(mgr->lockPlugin = virLockManagerPluginNew(lockManagerPluginName,
+                                                    NULL, NULL, 0))) {
+        goto error;
+    }
+
     mgr->drv = drv;
     mgr->flags = flags;
     mgr->virtDriver = virtDriver;
@@ -112,6 +128,7 @@ virSecurityManagerNewStack(virSecurityManagerPtr primary)
     virSecurityManagerPtr mgr =
         virSecurityManagerNewDriver(&virSecurityDriverStack,
                                     virSecurityManagerGetDriver(primary),
+                                    NULL,
                                     primary->flags);
 
     if (!mgr)
@@ -120,6 +137,8 @@ virSecurityManagerNewStack(virSecurityManagerPtr primary)
     if (virSecurityStackAddNested(mgr, primary) < 0)
         goto error;
 
+    mgr->lockPlugin = virObjectRef(mgr->lockPlugin);
+
     return mgr;
  error:
     virObjectUnref(mgr);
@@ -142,6 +161,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
                          uid_t user,
                          gid_t group,
                          unsigned int flags,
+                         const char *lockManagerPluginName,
                          virSecurityManagerDACChownCallback chownCallback)
 {
     virSecurityManagerPtr mgr;
@@ -152,6 +172,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
 
     mgr = virSecurityManagerNewDriver(&virSecurityDriverDAC,
                                       virtDriver,
+                                      lockManagerPluginName,
                                       flags & VIR_SECURITY_MANAGER_NEW_MASK);
 
     if (!mgr)
@@ -173,6 +194,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
 virSecurityManagerPtr
 virSecurityManagerNew(const char *name,
                       const char *virtDriver,
+                      const char *lockManagerPluginName,
                       unsigned int flags)
 {
     virSecurityDriverPtr drv = virSecurityDriverLookup(name, virtDriver);
@@ -201,6 +223,7 @@ virSecurityManagerNew(const char *name,
 
     return virSecurityManagerNewDriver(drv,
                                        virtDriver,
+                                       lockManagerPluginName,
                                        flags);
 }
 
index 1ead369e82bd71345aca6af490ab7a54998ecf78..c537e1c994696e1c4adcf358765c0d995ecd94a8 100644 (file)
@@ -45,6 +45,7 @@ typedef enum {
 
 virSecurityManagerPtr virSecurityManagerNew(const char *name,
                                             const char *virtDriver,
+                                            const char *lockManagerPluginName,
                                             unsigned int flags);
 
 virSecurityManagerPtr virSecurityManagerNewStack(virSecurityManagerPtr primary);
@@ -70,6 +71,7 @@ virSecurityManagerPtr virSecurityManagerNewDAC(const char *virtDriver,
                                                uid_t user,
                                                gid_t group,
                                                unsigned int flags,
+                                               const char *lockManagerPluginName,
                                                virSecurityManagerDACChownCallback chownCallback);
 
 int virSecurityManagerPreFork(virSecurityManagerPtr mgr);
index 4cda80cec2665f5231268adc081f46c08bea0886..b9eff1ee22d796b94e51c7817a2f7c93d6eefa37 100644 (file)
@@ -18,7 +18,7 @@ mymain(void)
     if (virThreadInitialize() < 0)
         return EXIT_FAILURE;
 
-    mgr = virSecurityManagerNew(NULL, "QEMU", VIR_SECURITY_MANAGER_DEFAULT_CONFINED);
+    mgr = virSecurityManagerNew(NULL, "QEMU", NULL, VIR_SECURITY_MANAGER_DEFAULT_CONFINED);
     if (mgr == NULL) {
         fprintf(stderr, "Failed to start security driver");
         return EXIT_FAILURE;
index 48fee7cd285b5880a48a5b10a7a4f77bfcbd912a..cf3cf237ce5dda6fb360f8cd9a2d17506acc4145 100644 (file)
@@ -349,7 +349,7 @@ mymain(void)
     if (!rc)
         return EXIT_AM_SKIP;
 
-    if (!(mgr = virSecurityManagerNew("selinux", "QEMU",
+    if (!(mgr = virSecurityManagerNew("selinux", "QEMU", NULL,
                                       VIR_SECURITY_MANAGER_DEFAULT_CONFINED |
                                       VIR_SECURITY_MANAGER_PRIVILEGED))) {
         VIR_TEST_VERBOSE("Unable to initialize security driver: %s\n",
index a785e9a7dac35466fc44d8b95d927c82fc01f3f6..5a19cb15fb9ed0963b59177e521181604be43ac0 100644 (file)
@@ -275,7 +275,7 @@ mymain(void)
     int ret = 0;
     virSecurityManagerPtr mgr;
 
-    if (!(mgr = virSecurityManagerNew("selinux", "QEMU",
+    if (!(mgr = virSecurityManagerNew("selinux", "QEMU", NULL,
                                       VIR_SECURITY_MANAGER_DEFAULT_CONFINED |
                                       VIR_SECURITY_MANAGER_PRIVILEGED))) {
         fprintf(stderr, "Unable to initialize security driver: %s\n",
index 70bed461b5130743c43ea5f9d7b139a6c41f4dcb..c50d05a3125e5b96a6984e5d379e8be18851bdb5 100644 (file)
@@ -717,7 +717,7 @@ int qemuTestDriverInit(virQEMUDriver *driver)
     if (qemuTestCapsCacheInsert(driver->qemuCapsCache, NULL) < 0)
         goto error;
 
-    if (!(mgr = virSecurityManagerNew("none", "qemu",
+    if (!(mgr = virSecurityManagerNew("none", "qemu", NULL,
                                       VIR_SECURITY_MANAGER_PRIVILEGED)))
         goto error;
     if (!(driver->securityManager = virSecurityManagerNewStack(mgr)))