]> git.proxmox.com Git - mirror_lxc.git/commitdiff
conf: ret-try devpts mount without gid=5 on error
authorChristian Brauner <christian.brauner@ubuntu.com>
Thu, 12 Apr 2018 09:12:06 +0000 (11:12 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Thu, 12 Apr 2018 10:48:58 +0000 (12:48 +0200)
We should always default to mounting devpts with gid=5 but we should fallback
to mounting without gid=5. This let's us cover use-cases such as container
started with only a single mapping e.g.:

lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1

Closes #2257.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/conf.c

index 443087d6c8ad817cb8c1f6c07b6958c1758bfdcf..212c3c96fe6a0369c01bc9f50545e7b6edc54121 100644 (file)
@@ -1523,7 +1523,7 @@ static struct id_map *find_mapped_nsid_entry(struct lxc_conf *conf, unsigned id,
 static int lxc_setup_devpts(struct lxc_conf *conf)
 {
        int ret;
-       const char *default_devpts_mntopts;
+       const char *default_devpts_mntopts = "gid=5,newinstance,ptmxmode=0666,mode=0620";
        char devpts_mntopts[256];
 
        if (conf->pts <= 0) {
@@ -1532,11 +1532,6 @@ static int lxc_setup_devpts(struct lxc_conf *conf)
                return 0;
        }
 
-       if (!find_mapped_nsid_entry(conf, 5, ID_TYPE_GID))
-               default_devpts_mntopts = "newinstance,ptmxmode=0666,mode=0620";
-       else
-               default_devpts_mntopts = "newinstance,ptmxmode=0666,mode=0620,gid=5";
-
        ret = snprintf(devpts_mntopts, sizeof(devpts_mntopts), "%s,max=%d",
                       default_devpts_mntopts, conf->pts);
        if (ret < 0 || (size_t)ret >= sizeof(devpts_mntopts))
@@ -1560,11 +1555,16 @@ static int lxc_setup_devpts(struct lxc_conf *conf)
                return -1;
        }
 
-       /* Mount new devpts instance. */
+       /* mount new devpts instance */
        ret = mount("devpts", "/dev/pts", "devpts", MS_NOSUID | MS_NOEXEC, devpts_mntopts);
        if (ret < 0) {
-               SYSERROR("Failed to mount new devpts instance");
-               return -1;
+               /* try mounting without gid=5 */
+               ret = mount("devpts", "/dev/pts", "devpts",
+                           MS_NOSUID | MS_NOEXEC, devpts_mntopts + sizeof("gid=5"));
+               if (ret < 0) {
+                       SYSERROR("Failed to mount new devpts instance");
+                       return -1;
+               }
        }
        DEBUG("Mount new devpts instance with options \"%s\"", devpts_mntopts);