summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/fs/msdosfs/msdosfs_vfsops.c2
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vfsops.c4
-rw-r--r--sys/kern/vfs_mount.c67
3 files changed, 59 insertions, 14 deletions
diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index f239c38..cc8b054 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -77,7 +77,7 @@
/* List of mount options we support */
static const char *msdosfs_opts[] = {
"from",
- "atime", "export", "force", "sync",
+ "noatime", "export", "force", "sync",
"uid", "gid", "mask", "dirmask",
"shortname", "shortnames", "longname", "longnames", "nowin95", "win95",
"kiconv", "cs_win", "cs_dos", "cs_local", "large",
diff --git a/sys/gnu/fs/ext2fs/ext2_vfsops.c b/sys/gnu/fs/ext2fs/ext2_vfsops.c
index d5ad6f2..ace6823 100644
--- a/sys/gnu/fs/ext2fs/ext2_vfsops.c
+++ b/sys/gnu/fs/ext2fs/ext2_vfsops.c
@@ -118,8 +118,8 @@ static int compute_sb_data(struct vnode * devvp,
struct ext2_super_block * es, struct ext2_sb_info * fs);
static const char *ext2_opts[] = { "from", "export", "union", "acls", "exec",
- "atime", "union", "suiddir", "multilabel", "symfollow", "clusterr",
- "clusterw", "force", NULL };
+ "noatime", "union", "suiddir", "multilabel", "nosymfollow",
+ "noclusterr", "noclusterw", "force", NULL };
/*
* VFS Operations.
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 3ae0d1a..5e6a84a 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -137,8 +137,8 @@ static const char *global_opts[] = {
"rdonly",
"ro",
"rw",
- "suid",
- "exec",
+ "nosuid",
+ "noexec",
"update",
NULL
};
@@ -638,16 +638,40 @@ vfs_donmount(struct thread *td, int fsflags, struct uio *fsoptions)
fsflags &= ~MNT_ASYNC;
else if (strcmp(opt->name, "noatime") == 0)
fsflags |= MNT_NOATIME;
+ else if (strcmp(opt->name, "atime") == 0) {
+ free(opt->name, M_MOUNT);
+ opt->name = strdup("nonoatime", M_MOUNT);
+ }
else if (strcmp(opt->name, "noclusterr") == 0)
fsflags |= MNT_NOCLUSTERR;
+ else if (strcmp(opt->name, "clusterr") == 0) {
+ free(opt->name, M_MOUNT);
+ opt->name = strdup("nonoclusterr", M_MOUNT);
+ }
else if (strcmp(opt->name, "noclusterw") == 0)
fsflags |= MNT_NOCLUSTERW;
+ else if (strcmp(opt->name, "clusterw") == 0) {
+ free(opt->name, M_MOUNT);
+ opt->name = strdup("nonoclusterw", M_MOUNT);
+ }
else if (strcmp(opt->name, "noexec") == 0)
fsflags |= MNT_NOEXEC;
+ else if (strcmp(opt->name, "exec") == 0) {
+ free(opt->name, M_MOUNT);
+ opt->name = strdup("nonoexec", M_MOUNT);
+ }
else if (strcmp(opt->name, "nosuid") == 0)
fsflags |= MNT_NOSUID;
+ else if (strcmp(opt->name, "suid") == 0) {
+ free(opt->name, M_MOUNT);
+ opt->name = strdup("nonosuid", M_MOUNT);
+ }
else if (strcmp(opt->name, "nosymfollow") == 0)
fsflags |= MNT_NOSYMFOLLOW;
+ else if (strcmp(opt->name, "symfollow") == 0) {
+ free(opt->name, M_MOUNT);
+ opt->name = strdup("nonosymfollow", M_MOUNT);
+ }
else if (strcmp(opt->name, "noro") == 0) {
fsflags &= ~MNT_RDONLY;
has_noro = 1;
@@ -1760,26 +1784,47 @@ int
vfs_filteropt(struct vfsoptlist *opts, const char **legal)
{
struct vfsopt *opt;
- const char **t, *p;
+ char errmsg[255];
+ const char **t, *p, *q;
+ int ret = 0;
TAILQ_FOREACH(opt, opts, link) {
p = opt->name;
+ q = NULL;
if (p[0] == 'n' && p[1] == 'o')
- p += 2;
- for(t = global_opts; *t != NULL; t++)
- if (!strcmp(*t, p))
+ q = p + 2;
+ for(t = global_opts; *t != NULL; t++) {
+ if (strcmp(*t, p) == 0)
break;
+ if (q != NULL) {
+ if (strcmp(*t, q) == 0)
+ break;
+ }
+ }
if (*t != NULL)
continue;
- for(t = legal; *t != NULL; t++)
- if (!strcmp(*t, p))
+ for(t = legal; *t != NULL; t++) {
+ if (strcmp(*t, p) == 0)
break;
+ if (q != NULL) {
+ if (strcmp(*t, q) == 0)
+ break;
+ }
+ }
if (*t != NULL)
continue;
- printf("mount option <%s> is unknown\n", p);
- return (EINVAL);
+ sprintf(errmsg, "mount option <%s> is unknown", p);
+ printf("%s\n", errmsg);
+ ret = EINVAL;
+ }
+ if (ret != 0) {
+ TAILQ_FOREACH(opt, opts, link) {
+ if (strcmp(opt->name, "errmsg") == 0) {
+ strncpy((char *)opt->value, errmsg, opt->len);
+ }
+ }
}
- return (0);
+ return (ret);
}
/*
OpenPOWER on IntegriCloud