]> git.proxmox.com Git - mirror_zfs-debian.git/commitdiff
mount.zfs: canonicalize mount point for mtab
authornordaux <nordaux@gmail.com>
Mon, 13 Feb 2012 03:44:20 +0000 (05:44 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 15 Nov 2012 22:28:52 +0000 (14:28 -0800)
Canonicalize the mount point passed to the mount.zfs helper.
This way a clean path is always added to mtab which ensures
the umount can properly locate and remove the entry.

Test case:
$ mkdir /mnt/foo
$ mount -t zfs zpool/foo /mnt/../mnt/foo////
$ umount /mnt/foo
$ cat /etc/mtab | grep zpool/foo
zpool/foo /mnt/../mnt/foo//// zfs rw 0 0

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #573

cmd/mount_zfs/mount_zfs.c

index 0a69d69d79e3dedff28a5cfd3432dcbe3e436816..6dd831d769f353e26df429129341d4e32c885e66 100644 (file)
@@ -311,7 +311,8 @@ main(int argc, char **argv)
        char mntopts[MNT_LINE_MAX] = { '\0' };
        char badopt[MNT_LINE_MAX] = { '\0' };
        char mtabopt[MNT_LINE_MAX] = { '\0' };
-       char *dataset, *mntpoint;
+       char mntpoint[PATH_MAX];
+       char *dataset;
        unsigned long mntflags = 0, zfsflags = 0, remount = 0;
        int sloppy = 0, fake = 0, verbose = 0, nomtab = 0, zfsutil = 0;
        int error, c;
@@ -367,7 +368,13 @@ main(int argc, char **argv)
        }
 
        dataset = parse_dataset(argv[0]);
-       mntpoint = argv[1];
+
+       /* canonicalize the mount point */
+       if (realpath(argv[1], mntpoint) == NULL) {
+               (void) fprintf(stderr, gettext("filesystem '%s' cannot be "
+                   "mounted due to a canonicalization failure.\n"), dataset);
+               return (MOUNT_SYSERR);
+       }
 
        /* validate mount options and set mntflags */
        error = parse_options(mntopts, &mntflags, &zfsflags, sloppy,