]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/mount.c
mount.nfs: Fix issue with -o user,exec
[nfs-utils.git] / utils / mount / mount.c
index c6644b1cde10b24a2be3c31ac138c21bc29c996f..4698d85fd98f6f9cd30c00f8644dff26ceb41082 100644 (file)
@@ -99,11 +99,9 @@ static const struct opt_map opt_map[] = {
   { "rbind",    0, 0, MS_BIND|MS_REC }, /* Idem, plus mounted subtrees */
   { "auto",     0, 0, MS_DUMMY },       /* Can be mounted using -a */
   { "noauto",   0, 0, MS_DUMMY },       /* Can  only be mounted explicitly */
-  { "users",    1, 0, MS_USERS|MS_NOEXEC|MS_NOSUID|MS_NODEV  },
-                                       /* Allow ordinary user to mount */
+  { "users",    1, 0, MS_USERS },      /* Allow ordinary user to mount */
   { "nousers",  0, 1, MS_DUMMY  },      /* Forbid ordinary user to mount */
-  { "user",     1, 0, MS_USER|MS_NOEXEC|MS_NOSUID|MS_NODEV  },
-                                       /* Allow ordinary user to mount */
+  { "user",     1, 0, MS_USER  },      /* Allow ordinary user to mount */
   { "nouser",   0, 1, MS_DUMMY   },     /* Forbid ordinary user to mount */
   { "owner",    0, 0, MS_DUMMY  },      /* Let the owner of the device mount */
   { "noowner",  0, 0, MS_DUMMY  },      /* Device owner has no special privs */
@@ -261,18 +259,30 @@ static void parse_opts (const char *options, int *flags, char **extra_opts)
 {
        if (options != NULL) {
                char *opts = xstrdup(options);
-               char *opt;
-               int len = strlen(opts) + 20;
+               char *opt, *p;
+               int len = strlen(opts) + 1;             /* include room for a null */
+               int open_quote = 0;
 
                *extra_opts = xmalloc(len);
                **extra_opts = '\0';
 
-               for (opt = strtok(opts, ","); opt; opt = strtok(NULL, ","))
-                       parse_opt(opt, flags, *extra_opts, len);
-
+               for (p=opts, opt=NULL; p && *p; p++) {
+                       if (!opt)
+                               opt = p;                /* begin of the option item */
+                       if (*p == '"')
+                               open_quote ^= 1;        /* reverse the status */
+                       if (open_quote)
+                               continue;               /* still in a quoted block */
+                       if (*p == ',')
+                               *p = '\0';              /* terminate the option item */
+                       /* end of option item or last item */
+                       if (*p == '\0' || *(p+1) == '\0') {
+                               parse_opt(opt, flags, *extra_opts, len);
+                               opt = NULL;
+                       }
+               }
                free(opts);
        }
-
 }
 
 static void mount_error(char *node)
@@ -425,7 +435,7 @@ int main(int argc, char *argv[])
                exit(1);
        }
 
-       if (strcmp(progname, "mount.nfsv4") == 0)
+       if (strcmp(progname, "mount.nfs4") == 0)
                nfs_mount_vers = 4;
 
        if (uid != 0) {