]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
drop create= from mount options (v2)
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Tue, 18 Feb 2014 18:56:29 +0000 (12:56 -0600)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 18 Feb 2014 19:09:21 +0000 (14:09 -0500)
Otherwise mount may return -EINVAL if in-kernel super-block parser
objects (as is the case with ext4).

Changelog v2:
also drop 'optional'
specifically drop create=dir, not create=*
fix order of arguments for memmove

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/conf.c

index d40e3e0b5233d6c0f78013110a7403ab3eee6742..483dff41303951af1273db84286643c23df32d2e 100644 (file)
@@ -1881,7 +1881,32 @@ static int mount_entry(const char *fsname, const char *target,
        return 0;
 }
 
-static inline int mount_entry_on_systemfs(const struct mntent *mntent)
+/*
+ * Remove 'optional', 'create=dir', and 'create=file' from mntopt
+ */
+static void cull_mntent_opt(struct mntent *mntent)
+{
+       int i;
+       char *p, *p2;
+       char *list[] = {"create=dir",
+                       "create=file",
+                       "optional",
+                       NULL };
+
+       for (i=0; list[i]; i++) {
+               if (!(p = strstr(mntent->mnt_opts, list[i])))
+                       continue;
+               p2 = strchr(p, ',');
+               if (!p2) {
+                       /* no more mntopts, so just chop it here */
+                       *p = '\0';
+                       continue;
+               }
+               memmove(p, p2+1, strlen(p2+1)+1);
+       }
+}
+
+static inline int mount_entry_on_systemfs(struct mntent *mntent)
 {
        unsigned long mntflags;
        char *mntdata;
@@ -1911,6 +1936,8 @@ static inline int mount_entry_on_systemfs(const struct mntent *mntent)
                        fclose(pathfile);
        }
 
+       cull_mntent_opt(mntent);
+
        if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) {
                free(mntdata);
                return -1;
@@ -1928,7 +1955,7 @@ static inline int mount_entry_on_systemfs(const struct mntent *mntent)
        return ret;
 }
 
-static int mount_entry_on_absolute_rootfs(const struct mntent *mntent,
+static int mount_entry_on_absolute_rootfs(struct mntent *mntent,
                                          const struct lxc_rootfs *rootfs,
                                          const char *lxc_name)
 {
@@ -1998,6 +2025,7 @@ skipabs:
                else
                        fclose(pathfile);
        }
+       cull_mntent_opt(mntent);
 
        if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) {
                free(mntdata);
@@ -2017,7 +2045,7 @@ out:
        return ret;
 }
 
-static int mount_entry_on_relative_rootfs(const struct mntent *mntent,
+static int mount_entry_on_relative_rootfs(struct mntent *mntent,
                                          const char *rootfs)
 {
        char path[MAXPATHLEN];
@@ -2055,6 +2083,7 @@ static int mount_entry_on_relative_rootfs(const struct mntent *mntent,
                else
                        fclose(pathfile);
        }
+       cull_mntent_opt(mntent);
 
        if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) {
                free(mntdata);