mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-02 04:15:46 +00:00
security_manager: Load lock plugin on init
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>
This commit is contained in:
parent
8b8aefb3d6
commit
3e26b476b5
4
cfg.mk
4
cfg.mk
@ -787,8 +787,10 @@ sc_prohibit_cross_inclusion:
|
|||||||
case $$dir in \
|
case $$dir in \
|
||||||
util/) safe="util";; \
|
util/) safe="util";; \
|
||||||
access/ | conf/) safe="($$dir|conf|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)";; \
|
safe="($$dir|util|conf|storage)";; \
|
||||||
|
security/) \
|
||||||
|
safe="($$dir|util|conf|storage|locking)";; \
|
||||||
xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \
|
xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \
|
||||||
*) safe="($$dir|$(mid_dirs)|util)";; \
|
*) safe="($$dir|$(mid_dirs)|util)";; \
|
||||||
esac; \
|
esac; \
|
||||||
|
@ -2625,7 +2625,8 @@ int main(int argc, char *argv[])
|
|||||||
ctrl->handshakeFd = handshakeFd;
|
ctrl->handshakeFd = handshakeFd;
|
||||||
|
|
||||||
if (!(ctrl->securityManager = virSecurityManagerNew(securityDriver,
|
if (!(ctrl->securityManager = virSecurityManagerNew(securityDriver,
|
||||||
LXC_DRIVER_NAME, 0)))
|
LXC_DRIVER_NAME,
|
||||||
|
NULL, 0)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (ctrl->def->seclabels) {
|
if (ctrl->def->seclabels) {
|
||||||
|
@ -1532,7 +1532,7 @@ lxcSecurityInit(virLXCDriverConfigPtr cfg)
|
|||||||
flags |= VIR_SECURITY_MANAGER_REQUIRE_CONFINED;
|
flags |= VIR_SECURITY_MANAGER_REQUIRE_CONFINED;
|
||||||
|
|
||||||
virSecurityManagerPtr mgr = virSecurityManagerNew(cfg->securityDriverName,
|
virSecurityManagerPtr mgr = virSecurityManagerNew(cfg->securityDriverName,
|
||||||
LXC_DRIVER_NAME, flags);
|
LXC_DRIVER_NAME, NULL, flags);
|
||||||
if (!mgr)
|
if (!mgr)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@ -355,6 +355,7 @@ qemuSecurityInit(virQEMUDriverPtr driver)
|
|||||||
while (names && *names) {
|
while (names && *names) {
|
||||||
if (!(mgr = qemuSecurityNew(*names,
|
if (!(mgr = qemuSecurityNew(*names,
|
||||||
QEMU_DRIVER_NAME,
|
QEMU_DRIVER_NAME,
|
||||||
|
cfg->metadataLockManagerName,
|
||||||
flags)))
|
flags)))
|
||||||
goto error;
|
goto error;
|
||||||
if (!stack) {
|
if (!stack) {
|
||||||
@ -370,6 +371,7 @@ qemuSecurityInit(virQEMUDriverPtr driver)
|
|||||||
} else {
|
} else {
|
||||||
if (!(mgr = qemuSecurityNew(NULL,
|
if (!(mgr = qemuSecurityNew(NULL,
|
||||||
QEMU_DRIVER_NAME,
|
QEMU_DRIVER_NAME,
|
||||||
|
cfg->metadataLockManagerName,
|
||||||
flags)))
|
flags)))
|
||||||
goto error;
|
goto error;
|
||||||
if (!(stack = qemuSecurityNewStack(mgr)))
|
if (!(stack = qemuSecurityNewStack(mgr)))
|
||||||
@ -386,6 +388,7 @@ qemuSecurityInit(virQEMUDriverPtr driver)
|
|||||||
cfg->user,
|
cfg->user,
|
||||||
cfg->group,
|
cfg->group,
|
||||||
flags,
|
flags,
|
||||||
|
cfg->metadataLockManagerName,
|
||||||
qemuSecurityChownCallback)))
|
qemuSecurityChownCallback)))
|
||||||
goto error;
|
goto error;
|
||||||
if (!stack) {
|
if (!stack) {
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
#include "virobject.h"
|
#include "virobject.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
|
#include "locking/lock_manager.h"
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_SECURITY
|
#define VIR_FROM_THIS VIR_FROM_SECURITY
|
||||||
|
|
||||||
@ -40,6 +41,8 @@ struct _virSecurityManager {
|
|||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
const char *virtDriver;
|
const char *virtDriver;
|
||||||
void *privateData;
|
void *privateData;
|
||||||
|
|
||||||
|
virLockManagerPluginPtr lockPlugin;
|
||||||
};
|
};
|
||||||
|
|
||||||
static virClassPtr virSecurityManagerClass;
|
static virClassPtr virSecurityManagerClass;
|
||||||
@ -50,8 +53,12 @@ void virSecurityManagerDispose(void *obj)
|
|||||||
{
|
{
|
||||||
virSecurityManagerPtr mgr = obj;
|
virSecurityManagerPtr mgr = obj;
|
||||||
|
|
||||||
if (mgr->drv->close)
|
if (mgr->drv &&
|
||||||
|
mgr->drv->close)
|
||||||
mgr->drv->close(mgr);
|
mgr->drv->close(mgr);
|
||||||
|
|
||||||
|
virObjectUnref(mgr->lockPlugin);
|
||||||
|
|
||||||
VIR_FREE(mgr->privateData);
|
VIR_FREE(mgr->privateData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,6 +78,7 @@ VIR_ONCE_GLOBAL_INIT(virSecurityManager);
|
|||||||
static virSecurityManagerPtr
|
static virSecurityManagerPtr
|
||||||
virSecurityManagerNewDriver(virSecurityDriverPtr drv,
|
virSecurityManagerNewDriver(virSecurityDriverPtr drv,
|
||||||
const char *virtDriver,
|
const char *virtDriver,
|
||||||
|
const char *lockManagerPluginName,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virSecurityManagerPtr mgr = NULL;
|
virSecurityManagerPtr mgr = NULL;
|
||||||
@ -90,6 +98,14 @@ virSecurityManagerNewDriver(virSecurityDriverPtr drv,
|
|||||||
if (!(mgr = virObjectLockableNew(virSecurityManagerClass)))
|
if (!(mgr = virObjectLockableNew(virSecurityManagerClass)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
if (!lockManagerPluginName)
|
||||||
|
lockManagerPluginName = "nop";
|
||||||
|
|
||||||
|
if (!(mgr->lockPlugin = virLockManagerPluginNew(lockManagerPluginName,
|
||||||
|
NULL, NULL, 0))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
mgr->drv = drv;
|
mgr->drv = drv;
|
||||||
mgr->flags = flags;
|
mgr->flags = flags;
|
||||||
mgr->virtDriver = virtDriver;
|
mgr->virtDriver = virtDriver;
|
||||||
@ -112,6 +128,7 @@ virSecurityManagerNewStack(virSecurityManagerPtr primary)
|
|||||||
virSecurityManagerPtr mgr =
|
virSecurityManagerPtr mgr =
|
||||||
virSecurityManagerNewDriver(&virSecurityDriverStack,
|
virSecurityManagerNewDriver(&virSecurityDriverStack,
|
||||||
virSecurityManagerGetDriver(primary),
|
virSecurityManagerGetDriver(primary),
|
||||||
|
NULL,
|
||||||
primary->flags);
|
primary->flags);
|
||||||
|
|
||||||
if (!mgr)
|
if (!mgr)
|
||||||
@ -120,6 +137,8 @@ virSecurityManagerNewStack(virSecurityManagerPtr primary)
|
|||||||
if (virSecurityStackAddNested(mgr, primary) < 0)
|
if (virSecurityStackAddNested(mgr, primary) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
mgr->lockPlugin = virObjectRef(mgr->lockPlugin);
|
||||||
|
|
||||||
return mgr;
|
return mgr;
|
||||||
error:
|
error:
|
||||||
virObjectUnref(mgr);
|
virObjectUnref(mgr);
|
||||||
@ -142,6 +161,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
|
|||||||
uid_t user,
|
uid_t user,
|
||||||
gid_t group,
|
gid_t group,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
const char *lockManagerPluginName,
|
||||||
virSecurityManagerDACChownCallback chownCallback)
|
virSecurityManagerDACChownCallback chownCallback)
|
||||||
{
|
{
|
||||||
virSecurityManagerPtr mgr;
|
virSecurityManagerPtr mgr;
|
||||||
@ -152,6 +172,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
|
|||||||
|
|
||||||
mgr = virSecurityManagerNewDriver(&virSecurityDriverDAC,
|
mgr = virSecurityManagerNewDriver(&virSecurityDriverDAC,
|
||||||
virtDriver,
|
virtDriver,
|
||||||
|
lockManagerPluginName,
|
||||||
flags & VIR_SECURITY_MANAGER_NEW_MASK);
|
flags & VIR_SECURITY_MANAGER_NEW_MASK);
|
||||||
|
|
||||||
if (!mgr)
|
if (!mgr)
|
||||||
@ -173,6 +194,7 @@ virSecurityManagerNewDAC(const char *virtDriver,
|
|||||||
virSecurityManagerPtr
|
virSecurityManagerPtr
|
||||||
virSecurityManagerNew(const char *name,
|
virSecurityManagerNew(const char *name,
|
||||||
const char *virtDriver,
|
const char *virtDriver,
|
||||||
|
const char *lockManagerPluginName,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virSecurityDriverPtr drv = virSecurityDriverLookup(name, virtDriver);
|
virSecurityDriverPtr drv = virSecurityDriverLookup(name, virtDriver);
|
||||||
@ -201,6 +223,7 @@ virSecurityManagerNew(const char *name,
|
|||||||
|
|
||||||
return virSecurityManagerNewDriver(drv,
|
return virSecurityManagerNewDriver(drv,
|
||||||
virtDriver,
|
virtDriver,
|
||||||
|
lockManagerPluginName,
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ typedef enum {
|
|||||||
|
|
||||||
virSecurityManagerPtr virSecurityManagerNew(const char *name,
|
virSecurityManagerPtr virSecurityManagerNew(const char *name,
|
||||||
const char *virtDriver,
|
const char *virtDriver,
|
||||||
|
const char *lockManagerPluginName,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
virSecurityManagerPtr virSecurityManagerNewStack(virSecurityManagerPtr primary);
|
virSecurityManagerPtr virSecurityManagerNewStack(virSecurityManagerPtr primary);
|
||||||
@ -70,6 +71,7 @@ virSecurityManagerPtr virSecurityManagerNewDAC(const char *virtDriver,
|
|||||||
uid_t user,
|
uid_t user,
|
||||||
gid_t group,
|
gid_t group,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
const char *lockManagerPluginName,
|
||||||
virSecurityManagerDACChownCallback chownCallback);
|
virSecurityManagerDACChownCallback chownCallback);
|
||||||
|
|
||||||
int virSecurityManagerPreFork(virSecurityManagerPtr mgr);
|
int virSecurityManagerPreFork(virSecurityManagerPtr mgr);
|
||||||
|
@ -18,7 +18,7 @@ mymain(void)
|
|||||||
if (virThreadInitialize() < 0)
|
if (virThreadInitialize() < 0)
|
||||||
return EXIT_FAILURE;
|
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) {
|
if (mgr == NULL) {
|
||||||
fprintf(stderr, "Failed to start security driver");
|
fprintf(stderr, "Failed to start security driver");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
@ -349,7 +349,7 @@ mymain(void)
|
|||||||
if (!rc)
|
if (!rc)
|
||||||
return EXIT_AM_SKIP;
|
return EXIT_AM_SKIP;
|
||||||
|
|
||||||
if (!(mgr = virSecurityManagerNew("selinux", "QEMU",
|
if (!(mgr = virSecurityManagerNew("selinux", "QEMU", NULL,
|
||||||
VIR_SECURITY_MANAGER_DEFAULT_CONFINED |
|
VIR_SECURITY_MANAGER_DEFAULT_CONFINED |
|
||||||
VIR_SECURITY_MANAGER_PRIVILEGED))) {
|
VIR_SECURITY_MANAGER_PRIVILEGED))) {
|
||||||
VIR_TEST_VERBOSE("Unable to initialize security driver: %s\n",
|
VIR_TEST_VERBOSE("Unable to initialize security driver: %s\n",
|
||||||
|
@ -275,7 +275,7 @@ mymain(void)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
virSecurityManagerPtr mgr;
|
virSecurityManagerPtr mgr;
|
||||||
|
|
||||||
if (!(mgr = virSecurityManagerNew("selinux", "QEMU",
|
if (!(mgr = virSecurityManagerNew("selinux", "QEMU", NULL,
|
||||||
VIR_SECURITY_MANAGER_DEFAULT_CONFINED |
|
VIR_SECURITY_MANAGER_DEFAULT_CONFINED |
|
||||||
VIR_SECURITY_MANAGER_PRIVILEGED))) {
|
VIR_SECURITY_MANAGER_PRIVILEGED))) {
|
||||||
fprintf(stderr, "Unable to initialize security driver: %s\n",
|
fprintf(stderr, "Unable to initialize security driver: %s\n",
|
||||||
|
@ -717,7 +717,7 @@ int qemuTestDriverInit(virQEMUDriver *driver)
|
|||||||
if (qemuTestCapsCacheInsert(driver->qemuCapsCache, NULL) < 0)
|
if (qemuTestCapsCacheInsert(driver->qemuCapsCache, NULL) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (!(mgr = virSecurityManagerNew("none", "qemu",
|
if (!(mgr = virSecurityManagerNew("none", "qemu", NULL,
|
||||||
VIR_SECURITY_MANAGER_PRIVILEGED)))
|
VIR_SECURITY_MANAGER_PRIVILEGED)))
|
||||||
goto error;
|
goto error;
|
||||||
if (!(driver->securityManager = virSecurityManagerNewStack(mgr)))
|
if (!(driver->securityManager = virSecurityManagerNewStack(mgr)))
|
||||||
|
Loading…
Reference in New Issue
Block a user