]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
config: Fix parsing of mount options 3213/head
authorMaximilian Blenk <Maximilian.Blenk@bmw.de>
Thu, 5 Dec 2019 15:44:41 +0000 (16:44 +0100)
committerMaximilian Blenk <Maximilian.Blenk@bmw.de>
Fri, 6 Dec 2019 13:17:37 +0000 (14:17 +0100)
When parsing mount options e.g. from lxc.mount.entry the specified
options are mapped to the flags constants. To do so, the strings
are compared to the options contained in mount_opt. However,
when comparing the strings, the length of the string is not
checked. That entails that the option "rootcontext=selinux-context"
is mapped to the mount option read-only (ro). This commit fixes
this issue by checking if a '=' is contained in the specified option
and additionally comparing the length of the strings.

Signed-off-by: Maximilian Blenk <Maximilian.Blenk@bmw.de>
src/lxc/conf.c

index b192c7550ac88b0d9c16918c877de8271559ddda..9410d4c9d8f5bb336d61d148d93c39859a763a8f 100644 (file)
@@ -1853,16 +1853,21 @@ static void parse_mntopt(char *opt, unsigned long *flags, char **data, size_t si
 {
        struct mount_opt *mo;
 
-       /* If opt is found in mount_opt, set or clear flags.
-        * Otherwise append it to data. */
-
-       for (mo = &mount_opt[0]; mo->name != NULL; mo++) {
-               if (strncmp(opt, mo->name, strlen(mo->name)) == 0) {
-                       if (mo->clear)
-                               *flags &= ~mo->flag;
-                       else
-                               *flags |= mo->flag;
-                       return;
+       /* If '=' is contained in opt, the option must go into data. */
+       if (!strchr(opt, '=')) {
+
+               /* If opt is found in mount_opt, set or clear flags.
+                * Otherwise append it to data. */
+               size_t opt_len = strlen(opt);
+               for (mo = &mount_opt[0]; mo->name != NULL; mo++) {
+                       size_t mo_name_len = strlen(mo->name);
+                       if (opt_len == mo_name_len && strncmp(opt, mo->name, mo_name_len) == 0) {
+                               if (mo->clear)
+                                       *flags &= ~mo->flag;
+                               else
+                                       *flags |= mo->flag;
+                               return;
+                       }
                }
        }