]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: fix user-mount by root for mount.<type> helpers
authorKarel Zak <kzak@redhat.com>
Tue, 26 Mar 2013 15:05:07 +0000 (16:05 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 26 Mar 2013 15:05:07 +0000 (16:05 +0100)
Append options like "exec" "suid" and "dev" to mount.<type> helpers
command line if the options are in fstab. This is relevant for root
user who calls mount(8) for fstab entries with "user,exec" etc.

Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/context_mount.c

index 00738b4b5edef12e3d2ddb0cd287b74d97226bfb..3b280ab9b6cbc01649e1cd44b339658f3d85fbaf 100644 (file)
@@ -275,6 +275,28 @@ static int generate_helper_optstr(struct libmnt_context *cxt, char **optstr)
        if (!*optstr)
                return -ENOMEM;
 
+       if (cxt->user_mountflags & MNT_MS_USER) {
+               /*
+                * This is unnecessary for real user-mounts as mount.<type>
+                * helpers have to always follow fstab rather than mount
+                * options on command line.
+                *
+                * But if you call mount.<type> as root then the helper follows
+                * command line. If there is (for example) "user,exec" in fstab
+                * then we have to manually append the "exec" back to the options
+                * string, bacause there is nothing like MS_EXEC (we have only
+                * MS_NOEXEC in mount flags and we don't care about the original
+                * mount string in libmount for VFS options).
+                */
+               if (!(cxt->mountflags & MS_NOEXEC))
+                       mnt_optstr_append_option(optstr, "exec", NULL);
+               if (!(cxt->mountflags & MS_NOSUID))
+                       mnt_optstr_append_option(optstr, "suid", NULL);
+               if (!(cxt->mountflags & MS_NODEV))
+                       mnt_optstr_append_option(optstr, "dev", NULL);
+       }
+
+
        if (cxt->flags & MNT_FL_SAVED_USER)
                rc = mnt_optstr_set_option(optstr, "user", cxt->orig_user);
        if (rc)