From: Serge Hallyn <serge.hal...@ubuntu.com>

Changelog: (Jul 22) only do this when actually mapping ids

Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com>
---
 src/lxc/cgroup.c | 11 ++++++++++-
 src/lxc/conf.c   | 16 ++++++++++------
 src/lxc/conf.h   |  6 ++++--
 src/lxc/lxc.h    |  4 +++-
 src/lxc/start.c  |  4 ++--
 5 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
index c707519..d75c064 100644
--- a/src/lxc/cgroup.c
+++ b/src/lxc/cgroup.c
@@ -286,12 +286,21 @@ static int do_cgroup_set(const char *path, const char 
*value)
  *
  * Returns 0 on success, < 0 on error.
  */
-int lxc_cgroup_set_bypath(const char *cgrelpath, const char *filename, const 
char *value)
+int lxc_cgroup_set_bypath(const char *cgrelpath, const char *filename,
+                         const char *value, int in_userns)
 {
        int ret;
        char *cgabspath;
        char path[MAXPATHLEN];
 
+       /*
+        * exception: if in a user namespace, don't try to set devices cgroup.
+        * (a) a task in non-init userns can't use most devices anyway, and
+        * (b) a task in non-init userns cannot write to devices.{allow,deny}
+        */
+       if (in_userns && strncmp(filename, "devices.", 8) == 0)
+               return 0;
+
        cgabspath = cgroup_path_get(filename, cgrelpath);
        if (!cgabspath)
                return -1;
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index f7ac030..b4cace5 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -1428,21 +1428,25 @@ static int setup_kmsg(const struct lxc_rootfs *rootfs,
 }
 
 static int _setup_cgroup(const char *cgpath, struct lxc_list *cgroups,
-                         int devices)
+                         struct lxc_conf *conf, int devices)
 {
        struct lxc_list *iterator;
        struct lxc_cgroup *cg;
        int ret = -1;
+       int in_userns = 0;
 
        if (lxc_list_empty(cgroups))
                return 0;
 
+       if (!lxc_list_empty(&conf->id_map))
+               in_userns = 1;
+
        lxc_list_for_each(iterator, cgroups) {
                cg = iterator->elem;
 
                if (devices == !strncmp("devices", cg->subsystem, 7)) {
                        if (lxc_cgroup_set_bypath(cgpath, cg->subsystem,
-                           cg->value)) {
+                           cg->value, in_userns)) {
                                ERROR("Error setting %s to %s for %s\n",
                                      cg->subsystem, cg->value, cgpath);
                                goto out;
@@ -1458,14 +1462,14 @@ out:
        return ret;
 }
 
-int setup_cgroup_devices(const char *cgpath, struct lxc_list *cgroups)
+int setup_cgroup_devices(const char *cgpath, struct lxc_list *cgroups, struct 
lxc_conf *conf)
 {
-       return _setup_cgroup(cgpath, cgroups, 1);
+       return _setup_cgroup(cgpath, cgroups, conf, 1);
 }
 
-int setup_cgroup(const char *cgpath, struct lxc_list *cgroups)
+int setup_cgroup(const char *cgpath, struct lxc_list *cgroups, struct lxc_conf 
*conf)
 {
-       return _setup_cgroup(cgpath, cgroups, 0);
+       return _setup_cgroup(cgpath, cgroups, conf, 0);
 }
 
 static void parse_mntopt(char *opt, unsigned long *flags, char **data)
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 065b1df..90daa46 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -293,8 +293,10 @@ struct lxc_conf {
 int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf,
                  const char *lxcpath, char *argv[]);
 
-extern int setup_cgroup(const char *cgpath, struct lxc_list *cgroups);
-extern int setup_cgroup_devices(const char *cgpath, struct lxc_list *cgroups);
+extern int setup_cgroup(const char *cgpath, struct lxc_list *cgroups,
+                       struct lxc_conf *conf);
+extern int setup_cgroup_devices(const char *cgpath, struct lxc_list *cgroups,
+                       struct lxc_conf *conf);
 extern int detect_shared_rootfs(void);
 
 /*
diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h
index 67e0d9e..8170eef 100644
--- a/src/lxc/lxc.h
+++ b/src/lxc/lxc.h
@@ -142,9 +142,11 @@ extern lxc_state_t lxc_state(const char *name, const char 
*lxcpath);
  * @cgpath    : the cgroup path of the container
  * @filename  : the cgroup attribute filename
  * @value     : the value to be set
+ * @in_userns : whether container is in a userns
  * Returns 0 on success, < 0 otherwise
  */
-extern int lxc_cgroup_set_bypath(const char *cgpath, const char *filename, 
const char *value);
+extern int lxc_cgroup_set_bypath(const char *cgpath, const char *filename, 
const char *value,
+                       int in_userns);
 
 /*
  * Set a specified value for a specified subsystem. The specified
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 00020de..00af884 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -672,7 +672,7 @@ int lxc_spawn(struct lxc_handler *handler)
        if ((handler->cgroup = lxc_cgroup_path_create(curcgroup, name)) == NULL)
                goto out_delete_net;
 
-       if (setup_cgroup(handler->cgroup, &handler->conf->cgroup)) {
+       if (setup_cgroup(handler->cgroup, &handler->conf->cgroup, 
handler->conf)) {
                ERROR("failed to setup the cgroups for '%s'", name);
                goto out_delete_net;
        }
@@ -707,7 +707,7 @@ int lxc_spawn(struct lxc_handler *handler)
        if (lxc_sync_barrier_child(handler, LXC_SYNC_POST_CONFIGURE))
                goto out_delete_net;
 
-       if (setup_cgroup_devices(handler->cgroup, &handler->conf->cgroup)) {
+       if (setup_cgroup_devices(handler->cgroup, &handler->conf->cgroup, 
handler->conf)) {
                /* an unfortunate special case: startup hooks may have already
                 * setup the cgroup.  If a setting fails, and this is the 
devices
                 * subsystem, *and* we are already in a subset of the cgroup,
-- 
1.8.1.2


------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to