static int opt_nofail = 0;
+static int invuser_flags;
+
static const char *opt_loopdev, *opt_vfstype, *opt_offset, *opt_sizelimit,
*opt_encryption, *opt_speed, *opt_comment, *opt_uhelper, *opt_helper;
* For the options uid= and gid= replace user or group name by its value.
*/
static inline void
-parse_opt(char *opt, int *mask, char **extra_opts) {
+parse_opt(char *opt, int *mask, int *inv_user, char **extra_opts) {
const struct opt_map *om;
for (om = opt_map; om->opt != NULL; om++)
*mask &= ~om->mask;
else
*mask |= om->mask;
+ if (om->inv && ((*mask & MS_USER) || (*mask & MS_USERS))
+ && (om->mask & MS_SECURE))
+ *inv_user |= om->mask;
if ((om->mask == MS_USER || om->mask == MS_USERS)
&& !om->inv)
*mask |= MS_SECURE;
/* end of option item or last item */
if (*p == '\0' || *(p+1) == '\0') {
if (!parse_string_opt(opt))
- parse_opt(opt, flags, extra_opts);
+ parse_opt(opt, flags, &invuser_flags, extra_opts);
opt = NULL;
}
}
/* Try to build a canonical options string. */
static char *
-fix_opts_string (int flags, const char *extra_opts, const char *user) {
+fix_opts_string (int flags, const char *extra_opts,
+ const char *user, int inv_user)
+{
const struct opt_map *om;
const struct string_opt_map *m;
char *new_opts;
if (user)
new_opts = append_opt(new_opts, "user=", user);
+ if (inv_user) {
+ for (om = opt_map; om->opt != NULL; om++) {
+ if (om->mask && om->inv
+ && (inv_user & om->mask) == om->mask) {
+ new_opts = append_opt(new_opts, om->opt, NULL);
+ inv_user &= ~om->mask;
+ }
+ }
+ }
+
return new_opts;
}
mnt.mnt_dir = "/";
mnt.mnt_fsname = spec_to_devname(fstab->m.mnt_fsname);
mnt.mnt_type = fstab->m.mnt_type;
- mnt.mnt_opts = fix_opts_string (flags, extra_opts, NULL);
+ mnt.mnt_opts = fix_opts_string (flags, extra_opts, NULL, 0);
mnt.mnt_freq = mnt.mnt_passno = 0;
free(extra_opts);
if (setuid(getuid()) < 0)
die(EX_FAIL, _("mount: cannot set user id: %m"));
- oo = fix_opts_string (flags, extra_opts, NULL);
+ oo = fix_opts_string(flags, extra_opts, NULL, invuser_flags);
mountargs[i++] = mountprog; /* 1 */
mountargs[i++] = (char *) spec; /* 2 */
mountargs[i++] = (char *) node; /* 3 */
}
#ifdef HAVE_LIBMOUNT_MOUNT
- mtab_opts = fix_opts_string(flags & ~MS_NOMTAB, extra_opts, user);
+ mtab_opts = fix_opts_string(flags & ~MS_NOMTAB, extra_opts, user, 0);
mtab_flags = flags;
if (fake)
}
if (fake || mnt5_res == 0) {
- char *mo = fix_opts_string (flags & ~MS_NOMTAB, extra_opts, user);
+ char *mo = fix_opts_string (flags & ~MS_NOMTAB, extra_opts, user, 0);
const char *tp = types ? types : "unknown";
/* Mount succeeded, report this (if verbose) and write mtab entry. */