|
|
c401cc |
From 459f9047c9a4ee9b418a9a60467c45e27376af5d Mon Sep 17 00:00:00 2001
|
|
|
c401cc |
Message-Id: <459f9047c9a4ee9b418a9a60467c45e27376af5d.1386348946.git.jdenemar@redhat.com>
|
|
|
c401cc |
From: "Daniel P. Berrange" <berrange@redhat.com>
|
|
|
c401cc |
Date: Mon, 2 Dec 2013 13:40:33 +0000
|
|
|
c401cc |
Subject: [PATCH] LXC: Ensure security context is set when mounting images
|
|
|
c401cc |
|
|
|
c401cc |
For
|
|
|
c401cc |
|
|
|
c401cc |
https://bugzilla.redhat.com/show_bug.cgi?id=923903
|
|
|
c401cc |
|
|
|
c401cc |
When setting up filesystems backed by block devices or file
|
|
|
c401cc |
images, the SELinux mount options must be used to ensure the
|
|
|
c401cc |
correct context is set
|
|
|
c401cc |
|
|
|
c401cc |
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
|
|
|
c401cc |
(cherry picked from commit 262157f6510d5be327d6f6ed5152954cbb9d1e50)
|
|
|
c401cc |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
c401cc |
---
|
|
|
c401cc |
src/lxc/lxc_container.c | 36 +++++++++++++++++++++---------------
|
|
|
c401cc |
1 file changed, 21 insertions(+), 15 deletions(-)
|
|
|
c401cc |
|
|
|
c401cc |
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
|
|
|
c401cc |
index 3f54f82..9854b33 100644
|
|
|
c401cc |
--- a/src/lxc/lxc_container.c
|
|
|
c401cc |
+++ b/src/lxc/lxc_container.c
|
|
|
c401cc |
@@ -111,7 +111,8 @@ struct __lxc_child_argv {
|
|
|
c401cc |
};
|
|
|
c401cc |
|
|
|
c401cc |
static int lxcContainerMountFSBlock(virDomainFSDefPtr fs,
|
|
|
c401cc |
- const char *srcprefix);
|
|
|
c401cc |
+ const char *srcprefix,
|
|
|
c401cc |
+ const char *sec_mount_options);
|
|
|
c401cc |
|
|
|
c401cc |
|
|
|
c401cc |
/*
|
|
|
c401cc |
@@ -556,7 +557,8 @@ cleanup:
|
|
|
c401cc |
|
|
|
c401cc |
|
|
|
c401cc |
static int lxcContainerPrepareRoot(virDomainDefPtr def,
|
|
|
c401cc |
- virDomainFSDefPtr root)
|
|
|
c401cc |
+ virDomainFSDefPtr root,
|
|
|
c401cc |
+ const char *sec_mount_options)
|
|
|
c401cc |
{
|
|
|
c401cc |
char *dst;
|
|
|
c401cc |
char *tmp;
|
|
|
c401cc |
@@ -586,7 +588,7 @@ static int lxcContainerPrepareRoot(virDomainDefPtr def,
|
|
|
c401cc |
tmp = root->dst;
|
|
|
c401cc |
root->dst = dst;
|
|
|
c401cc |
|
|
|
c401cc |
- if (lxcContainerMountFSBlock(root, "") < 0) {
|
|
|
c401cc |
+ if (lxcContainerMountFSBlock(root, "", sec_mount_options) < 0) {
|
|
|
c401cc |
root->dst = tmp;
|
|
|
c401cc |
VIR_FREE(dst);
|
|
|
c401cc |
return -1;
|
|
|
c401cc |
@@ -1183,7 +1185,8 @@ lxcContainerMountDetectFilesystem(const char *src ATTRIBUTE_UNUSED,
|
|
|
c401cc |
static int lxcContainerMountFSBlockAuto(virDomainFSDefPtr fs,
|
|
|
c401cc |
int fsflags,
|
|
|
c401cc |
const char *src,
|
|
|
c401cc |
- const char *srcprefix)
|
|
|
c401cc |
+ const char *srcprefix,
|
|
|
c401cc |
+ const char *sec_mount_options)
|
|
|
c401cc |
{
|
|
|
c401cc |
FILE *fp = NULL;
|
|
|
c401cc |
int ret = -1;
|
|
|
c401cc |
@@ -1258,8 +1261,9 @@ retry:
|
|
|
c401cc |
STREQ(type, "*"))
|
|
|
c401cc |
gotStar = true;
|
|
|
c401cc |
|
|
|
c401cc |
- VIR_DEBUG("Trying mount %s with %s", src, type);
|
|
|
c401cc |
- if (mount(src, fs->dst, type, fsflags, NULL) < 0) {
|
|
|
c401cc |
+ VIR_DEBUG("Trying mount '%s' on '%s' with '%s' opts '%s'",
|
|
|
c401cc |
+ src, fs->dst, type, sec_mount_options);
|
|
|
c401cc |
+ if (mount(src, fs->dst, type, fsflags, sec_mount_options) < 0) {
|
|
|
c401cc |
/* These errnos indicate a bogus filesystem type for
|
|
|
c401cc |
* the image we have, so skip to the next type
|
|
|
c401cc |
*/
|
|
|
c401cc |
@@ -1310,7 +1314,8 @@ cleanup:
|
|
|
c401cc |
*/
|
|
|
c401cc |
static int lxcContainerMountFSBlockHelper(virDomainFSDefPtr fs,
|
|
|
c401cc |
const char *src,
|
|
|
c401cc |
- const char *srcprefix)
|
|
|
c401cc |
+ const char *srcprefix,
|
|
|
c401cc |
+ const char *sec_mount_options)
|
|
|
c401cc |
{
|
|
|
c401cc |
int fsflags = 0;
|
|
|
c401cc |
int ret = -1;
|
|
|
c401cc |
@@ -1330,9 +1335,9 @@ static int lxcContainerMountFSBlockHelper(virDomainFSDefPtr fs,
|
|
|
c401cc |
goto cleanup;
|
|
|
c401cc |
|
|
|
c401cc |
if (format) {
|
|
|
c401cc |
- VIR_DEBUG("Mount '%s' on '%s' with detected format '%s'",
|
|
|
c401cc |
- src, fs->dst, format);
|
|
|
c401cc |
- if (mount(src, fs->dst, format, fsflags, NULL) < 0) {
|
|
|
c401cc |
+ VIR_DEBUG("Mount '%s' on '%s' with detected format '%s' opts '%s'",
|
|
|
c401cc |
+ src, fs->dst, format, sec_mount_options);
|
|
|
c401cc |
+ if (mount(src, fs->dst, format, fsflags, sec_mount_options) < 0) {
|
|
|
c401cc |
virReportSystemError(errno,
|
|
|
c401cc |
_("Failed to mount device %s to %s as %s"),
|
|
|
c401cc |
src, fs->dst, format);
|
|
|
c401cc |
@@ -1340,7 +1345,7 @@ static int lxcContainerMountFSBlockHelper(virDomainFSDefPtr fs,
|
|
|
c401cc |
}
|
|
|
c401cc |
ret = 0;
|
|
|
c401cc |
} else {
|
|
|
c401cc |
- ret = lxcContainerMountFSBlockAuto(fs, fsflags, src, srcprefix);
|
|
|
c401cc |
+ ret = lxcContainerMountFSBlockAuto(fs, fsflags, src, srcprefix, sec_mount_options);
|
|
|
c401cc |
}
|
|
|
c401cc |
|
|
|
c401cc |
cleanup:
|
|
|
c401cc |
@@ -1350,7 +1355,8 @@ cleanup:
|
|
|
c401cc |
|
|
|
c401cc |
|
|
|
c401cc |
static int lxcContainerMountFSBlock(virDomainFSDefPtr fs,
|
|
|
c401cc |
- const char *srcprefix)
|
|
|
c401cc |
+ const char *srcprefix,
|
|
|
c401cc |
+ const char *sec_mount_options)
|
|
|
c401cc |
{
|
|
|
c401cc |
char *src = NULL;
|
|
|
c401cc |
int ret = -1;
|
|
|
c401cc |
@@ -1360,7 +1366,7 @@ static int lxcContainerMountFSBlock(virDomainFSDefPtr fs,
|
|
|
c401cc |
if (virAsprintf(&src, "%s%s", srcprefix, fs->src) < 0)
|
|
|
c401cc |
goto cleanup;
|
|
|
c401cc |
|
|
|
c401cc |
- ret = lxcContainerMountFSBlockHelper(fs, src, srcprefix);
|
|
|
c401cc |
+ ret = lxcContainerMountFSBlockHelper(fs, src, srcprefix, sec_mount_options);
|
|
|
c401cc |
|
|
|
c401cc |
VIR_DEBUG("Done mounting filesystem ret=%d", ret);
|
|
|
c401cc |
|
|
|
c401cc |
@@ -1422,7 +1428,7 @@ static int lxcContainerMountFS(virDomainFSDefPtr fs,
|
|
|
c401cc |
return -1;
|
|
|
c401cc |
break;
|
|
|
c401cc |
case VIR_DOMAIN_FS_TYPE_BLOCK:
|
|
|
c401cc |
- if (lxcContainerMountFSBlock(fs, "/.oldroot") < 0)
|
|
|
c401cc |
+ if (lxcContainerMountFSBlock(fs, "/.oldroot", sec_mount_options) < 0)
|
|
|
c401cc |
return -1;
|
|
|
c401cc |
break;
|
|
|
c401cc |
case VIR_DOMAIN_FS_TYPE_RAM:
|
|
|
c401cc |
@@ -1530,7 +1536,7 @@ static int lxcContainerSetupPivotRoot(virDomainDefPtr vmDef,
|
|
|
c401cc |
goto cleanup;
|
|
|
c401cc |
|
|
|
c401cc |
/* Ensure the root filesystem is mounted */
|
|
|
c401cc |
- if (lxcContainerPrepareRoot(vmDef, root) < 0)
|
|
|
c401cc |
+ if (lxcContainerPrepareRoot(vmDef, root, sec_mount_options) < 0)
|
|
|
c401cc |
goto cleanup;
|
|
|
c401cc |
|
|
|
c401cc |
/* Gives us a private root, leaving all parent OS mounts on /.oldroot */
|
|
|
c401cc |
--
|
|
|
c401cc |
1.8.4.5
|
|
|
c401cc |
|