Sorry for the excessive noise, I'm not paying close enough attention. That was supposed to read *fsopts = '\0';
On Thu Feb 11, 2016 at 12:41:33AM -0600, Brad Barden wrote: > If a mount helper is used, only argopts (given on commandline) are > passed to the helper via -o parameter. Option strings from fstab are > ignored. > > This patch replaces global argopts pointer with a character array > fsopts. A maximum length for filesytem options is #defined (used by > fsopts and data), and argument/mntent options are length-checked to fit. > A filesystem with too long an option string will print an error, cause > mount to exit with an error status, and not attempt to mount the > filesystem. This obviates the need for overflow checking of data in > parseopts(), though it hasn't been removed. > --- > > v2 fix: I missed emptying the fsopts string when mounting multiple (line > 319). > > diff --git a/mount.c b/mount.c > index 8888c60..0cf70ae 100644 > --- a/mount.c > +++ b/mount.c > @@ -15,6 +15,8 @@ > #include "text.h" > #include "util.h" > > +#define FSOPTS_MAXLEN 512 > + > struct { > const char *opt; > const char *notopt; > @@ -37,7 +39,7 @@ struct { > }; > > static unsigned long argflags = 0; > -static char *argopts = NULL; > +static char fsopts[FSOPTS_MAXLEN] = ""; > > static char * > findtype(const char *types, const char *t) > @@ -121,9 +123,9 @@ mounthelper(const char *fsname, const char *dir, const > char *fstype) > if (argflags & MS_REC) > eargv[i++] = "-R"; > > - if (argopts) { > + if (*fsopts) { > eargv[i++] = "-o"; > - eargv[i++] = argopts; > + eargv[i++] = fsopts; > } > eargv[i++] = fsname; > eargv[i++] = dir; > @@ -188,11 +190,11 @@ usage(void) > int > main(int argc, char *argv[]) > { > - char *types = NULL, data[512] = "", *resolvpath = NULL; > + char *types = NULL, data[FSOPTS_MAXLEN] = "", *resolvpath = NULL; > char *files[] = { "/proc/mounts", "/etc/fstab", NULL }; > const char *source, *target; > struct mntent *me = NULL; > - int aflag = 0, oflag = 0, status = 0, i, r; > + int aflag = 0, status = 0, i, r; > unsigned long flags = 0; > FILE *fp; > > @@ -210,9 +212,9 @@ main(int argc, char *argv[]) > aflag = 1; > break; > case 'o': > - oflag = 1; > - argopts = EARGF(usage()); > - parseopts(argopts, &flags, data, sizeof(data)); > + if (strlcat(fsopts, EARGF(usage()), sizeof(fsopts)) > > sizeof(fsopts)) > + eprintf("option string too long\n"); > + parseopts(fsopts, &flags, data, sizeof(data)); > break; > case 't': > types = EARGF(usage()); > @@ -260,8 +262,10 @@ main(int argc, char *argv[]) > target = me->mnt_dir; > source = me->mnt_fsname; > } > - if (!oflag) > - parseopts(me->mnt_opts, &flags, data, > sizeof(data)); > + if (!*fsopts) > + if (strlcat(fsopts, me->mnt_opts, > sizeof(fsopts)) > sizeof(fsopts)) > + eprintf("%s: option string too > long\n", target); > + parseopts(fsopts, &flags, data, > sizeof(data)); > if (!types) > types = me->mnt_type; > goto mountsingle; > @@ -294,7 +298,13 @@ mountall: > if (hasmntopt(me, MNTOPT_NOAUTO) || mounted(me->mnt_dir)) > continue; > flags = 0; > - parseopts(me->mnt_opts, &flags, data, sizeof(data)); > + fsopts = ""; > + if (strlcat(fsopts, me->mnt_opts, sizeof(fsopts)) > > sizeof(fsopts)) { > + weprintf("%s: option string too long\n", me->mnt_dir); > + status = 1; > + continue; > + } > + parseopts(fsopts, &flags, data, sizeof(data)); > /* if -t types specified: > * if non-match, skip > * if match and prefixed with "no", skip */ > -- > 2.3.6 > >