mount: -T OTHERTAB support
authorIsaac Dunham <ibid.ag@gmail.com>
Wed, 11 Mar 2015 15:07:24 +0000 (16:07 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Mar 2015 15:07:24 +0000 (16:07 +0100)
function                                             old     new   delta
mount_main                                          1221    1241     +20
packed_usage                                       30616   30610      -6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Signed-off-by: Isaac Dunham <ibid.ag@gmail.com>
util-linux/Config.src
util-linux/mount.c

index c1cd6daa43f0015a034f20d79890b87d6da5c78f..854b3682e0f757a849c5179a7bb84090524c22d8 100644 (file)
@@ -434,94 +434,6 @@ config MORE
          you will probably find this utility very helpful. If you don't have
          any need to reading text files, you can leave this disabled.
 
-config MOUNT
-       bool "mount"
-       default y
-       select PLATFORM_LINUX
-       help
-         All files and filesystems in Unix are arranged into one big directory
-         tree. The 'mount' utility is used to graft a filesystem onto a
-         particular part of the tree. A filesystem can either live on a block
-         device, or it can be accessible over the network, as is the case with
-         NFS filesystems. Most people using BusyBox will also want to enable
-         the 'mount' utility.
-
-config FEATURE_MOUNT_FAKE
-       bool "Support option -f"
-       default y
-       depends on MOUNT
-       help
-         Enable support for faking a file system mount.
-
-config FEATURE_MOUNT_VERBOSE
-       bool "Support option -v"
-       default y
-       depends on MOUNT
-       help
-         Enable multi-level -v[vv...] verbose messages. Useful if you
-         debug mount problems and want to see what is exactly passed
-         to the kernel.
-
-config FEATURE_MOUNT_HELPERS
-       bool "Support mount helpers"
-       default n
-       depends on MOUNT
-       help
-         Enable mounting of virtual file systems via external helpers.
-         E.g. "mount obexfs#-b00.11.22.33.44.55 /mnt" will in effect call
-         "obexfs -b00.11.22.33.44.55 /mnt"
-         Also "mount -t sometype [-o opts] fs /mnt" will try
-         "sometype [-o opts] fs /mnt" if simple mount syscall fails.
-         The idea is to use such virtual filesystems in /etc/fstab.
-
-config FEATURE_MOUNT_LABEL
-       bool "Support specifying devices by label or UUID"
-       default y
-       depends on MOUNT
-       select VOLUMEID
-       help
-         This allows for specifying a device by label or uuid, rather than by
-         name. This feature utilizes the same functionality as blkid/findfs.
-         This also enables label or uuid support for swapon.
-
-config FEATURE_MOUNT_NFS
-       bool "Support mounting NFS file systems on Linux < 2.6.23"
-       default n
-       depends on MOUNT
-       select FEATURE_HAVE_RPC
-       select FEATURE_SYSLOG
-       help
-         Enable mounting of NFS file systems on Linux kernels prior
-         to version 2.6.23. Note that in this case mounting of NFS
-         over IPv6 will not be possible.
-
-         Note that this option links in RPC support from libc,
-         which is rather large (~10 kbytes on uclibc).
-
-config FEATURE_MOUNT_CIFS
-       bool "Support mounting CIFS/SMB file systems"
-       default y
-       depends on MOUNT
-       help
-         Enable support for samba mounts.
-
-config FEATURE_MOUNT_FLAGS
-       depends on MOUNT
-       bool "Support lots of -o flags in mount"
-       default y
-       help
-         Without this, mount only supports ro/rw/remount. With this, it
-         supports nosuid, suid, dev, nodev, exec, noexec, sync, async, atime,
-         noatime, diratime, nodiratime, loud, bind, move, shared, slave,
-         private, unbindable, rshared, rslave, rprivate, and runbindable.
-
-config FEATURE_MOUNT_FSTAB
-       depends on MOUNT
-       bool "Support /etc/fstab and -a"
-       default y
-       help
-         Support mount all and looking for files in /etc/fstab.
-
 config PIVOT_ROOT
        bool "pivot_root"
        default y
index 62fd41fd75a1de05c6e92e7eac153295061207e0..fbc89c862f3f7a6fe6778f6a95c0cf424007a3d6 100644 (file)
 // mount_it_now() does the actual mount.
 //
 
+//config:config MOUNT
+//config:      bool "mount"
+//config:      default y
+//config:      select PLATFORM_LINUX
+//config:      help
+//config:        All files and filesystems in Unix are arranged into one big directory
+//config:        tree. The 'mount' utility is used to graft a filesystem onto a
+//config:        particular part of the tree. A filesystem can either live on a block
+//config:        device, or it can be accessible over the network, as is the case with
+//config:        NFS filesystems. Most people using BusyBox will also want to enable
+//config:        the 'mount' utility.
+//config:
+//config:config FEATURE_MOUNT_FAKE
+//config:      bool "Support option -f"
+//config:      default y
+//config:      depends on MOUNT
+//config:      help
+//config:        Enable support for faking a file system mount.
+//config:
+//config:config FEATURE_MOUNT_VERBOSE
+//config:      bool "Support option -v"
+//config:      default y
+//config:      depends on MOUNT
+//config:      help
+//config:        Enable multi-level -v[vv...] verbose messages. Useful if you
+//config:        debug mount problems and want to see what is exactly passed
+//config:        to the kernel.
+//config:
+//config:config FEATURE_MOUNT_HELPERS
+//config:      bool "Support mount helpers"
+//config:      default n
+//config:      depends on MOUNT
+//config:      help
+//config:        Enable mounting of virtual file systems via external helpers.
+//config:        E.g. "mount obexfs#-b00.11.22.33.44.55 /mnt" will in effect call
+//config:        "obexfs -b00.11.22.33.44.55 /mnt"
+//config:        Also "mount -t sometype [-o opts] fs /mnt" will try
+//config:        "sometype [-o opts] fs /mnt" if simple mount syscall fails.
+//config:        The idea is to use such virtual filesystems in /etc/fstab.
+//config:
+//config:config FEATURE_MOUNT_LABEL
+//config:      bool "Support specifying devices by label or UUID"
+//config:      default y
+//config:      depends on MOUNT
+//config:      select VOLUMEID
+//config:      help
+//config:        This allows for specifying a device by label or uuid, rather than by
+//config:        name. This feature utilizes the same functionality as blkid/findfs.
+//config:        This also enables label or uuid support for swapon.
+//config:
+//config:config FEATURE_MOUNT_NFS
+//config:      bool "Support mounting NFS file systems on Linux < 2.6.23"
+//config:      default n
+//config:      depends on MOUNT
+//config:      select FEATURE_HAVE_RPC
+//config:      select FEATURE_SYSLOG
+//config:      help
+//config:        Enable mounting of NFS file systems on Linux kernels prior
+//config:        to version 2.6.23. Note that in this case mounting of NFS
+//config:        over IPv6 will not be possible.
+//config:
+//config:        Note that this option links in RPC support from libc,
+//config:        which is rather large (~10 kbytes on uclibc).
+//config:
+//config:config FEATURE_MOUNT_CIFS
+//config:      bool "Support mounting CIFS/SMB file systems"
+//config:      default y
+//config:      depends on MOUNT
+//config:      help
+//config:        Enable support for samba mounts.
+//config:
+//config:config FEATURE_MOUNT_FLAGS
+//config:      depends on MOUNT
+//config:      bool "Support lots of -o flags in mount"
+//config:      default y
+//config:      help
+//config:        Without this, mount only supports ro/rw/remount. With this, it
+//config:        supports nosuid, suid, dev, nodev, exec, noexec, sync, async, atime,
+//config:        noatime, diratime, nodiratime, loud, bind, move, shared, slave,
+//config:        private, unbindable, rshared, rslave, rprivate, and runbindable.
+//config:
+//config:config FEATURE_MOUNT_FSTAB
+//config:      depends on MOUNT
+//config:      bool "Support /etc/fstab and -a"
+//config:      default y
+//config:      help
+//config:        Support mount all and looking for files in /etc/fstab.
+//config:
+//config:config FEATURE_MOUNT_OTHERTAB
+//config:      depends on FEATURE_MOUNT_FSTAB
+//config:      bool "Support -T <alt_fstab>"
+//config:      default y
+//config:      help
+//config:        Support mount -T (specifying an alternate fstab)
+
 //usage:#define mount_trivial_usage
-//usage:       "[OPTIONS] [-o OPTS] DEVICE NODE"
+//usage:       "[OPTIONS] [-o OPT] DEVICE NODE"
 //usage:#define mount_full_usage "\n\n"
 //usage:       "Mount a filesystem. Filesystem autodetection requires /proc.\n"
 //usage:     "\n       -a              Mount all filesystems in fstab"
 //usage:       )
 ////usage:   "\n       -s              Sloppy (ignored)"
 //usage:     "\n       -r              Read-only mount"
-//usage:     "\n       -w              Read-write mount (default)"
+////usage:     "\n     -w              Read-write mount (default)"
 //usage:     "\n       -t FSTYPE[,...] Filesystem type(s)"
+//usage:       IF_FEATURE_MOUNT_OTHERTAB(
+//usage:     "\n       -T FILE         Read FILE instead of /etc/fstab"
+//usage:       )
 //usage:     "\n       -O OPT          Mount only filesystems with option OPT (-a only)"
 //usage:     "\n-o OPT:"
 //usage:       IF_FEATURE_MOUNT_LOOP(
 //usage:     "\n       move            Relocate an existing mount point"
 //usage:       )
 //usage:     "\n       remount         Remount a mounted filesystem, changing flags"
-//usage:     "\n       ro/rw           Same as -r/-w"
+//usage:     "\n       ro              Same as -r"
 //usage:     "\n"
 //usage:     "\nThere are filesystem-specific -o flags."
 //usage:
@@ -167,7 +265,7 @@ enum {
 };
 
 
-#define OPTION_STR "o:t:rwanfvsiO:"
+#define OPTION_STR "o:t:rwanfvsiO:" IF_FEATURE_MOUNT_OTHERTAB("T:")
 enum {
        OPT_o = (1 << 0),
        OPT_t = (1 << 1),
@@ -180,6 +278,7 @@ enum {
        OPT_s = (1 << 8),
        OPT_i = (1 << 9),
        OPT_O = (1 << 10),
+       OPT_T = (1 << 11),
 };
 
 #if ENABLE_FEATURE_MTAB_SUPPORT
@@ -2034,7 +2133,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
        char *O_optmatch = NULL;
        char *storage_path;
        llist_t *lst_o = NULL;
-       const char *fstabname;
+       const char *fstabname = "/etc/fstab";
        FILE *fstab;
        int i, j;
        int rc = EXIT_SUCCESS;
@@ -2061,6 +2160,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
        // Max 2 params; -o is a list, -v is a counter
        opt_complementary = "?2o::" IF_FEATURE_MOUNT_VERBOSE("vv");
        opt = getopt32(argv, OPTION_STR, &lst_o, &fstype, &O_optmatch
+                       IF_FEATURE_MOUNT_OTHERTAB(, &fstabname)
                        IF_FEATURE_MOUNT_VERBOSE(, &verbose));
        while (lst_o) append_mount_options(&cmdopts, llist_pop(&lst_o)); // -o
        if (opt & OPT_r) append_mount_options(&cmdopts, "ro"); // -r
@@ -2128,8 +2228,10 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
                return rc;
        }
 
+       // A malicious user could overmount /usr without this.
+       if (ENABLE_FEATURE_MOUNT_OTHERTAB && nonroot)
+               fstabname = "/etc/fstab";
        // Open either fstab or mtab
-       fstabname = "/etc/fstab";
        if (cmdopt_flags & MS_REMOUNT) {
                // WARNING. I am not sure this matches util-linux's
                // behavior. It's possible util-linux does not