Re-apply path sanitizer, as mount(8) still mangles it

Prior to util-linux 2.36.2, if a file or directory in the
current working directory was named 'dataset' then mount(8)
would prepend the current working directory to the dataset.

Eventually, we should be able to drop this workaround.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Sterling Jensen <sterlingjensen@users.noreply.github.com>
Closes #11295 
Closes #11462
This commit is contained in:
sterlingjensen 2021-01-19 13:57:31 -06:00 committed by Brian Behlendorf
parent 81f981cd82
commit e269e1c07a
2 changed files with 32 additions and 3 deletions

View File

@ -50,6 +50,21 @@ libzfs_handle_t *g_zfs;
static void static void
parse_dataset(const char *target, char **dataset) parse_dataset(const char *target, char **dataset)
{ {
/*
* Prior to util-linux 2.36.2, if a file or directory in the
* current working directory was named 'dataset' then mount(8)
* would prepend the current working directory to the dataset.
* Check for it and strip the prepended path when it is added.
*/
char cwd[PATH_MAX];
if (getcwd(cwd, PATH_MAX) == NULL) {
perror("getcwd");
return;
}
int len = strlen(cwd);
if (strncmp(cwd, target, len) == 0)
target += len;
/* Assume pool/dataset is more likely */ /* Assume pool/dataset is more likely */
strlcpy(*dataset, target, PATH_MAX); strlcpy(*dataset, target, PATH_MAX);

View File

@ -32,7 +32,9 @@ typeset -r fs=$TESTPOOL/$TESTFS
function cleanup function cleanup
{ {
cd $STF_SUITE cd $STF_SUITE
[[ -d $TESTDIR/$$ ]] && (rm -rf $TESTDIR/$$ || log_fail) if [[ -d $TESTDIR/$$ ]]; then
log_must rm -rf $TESTDIR/$$
fi
mounted && zfs $mountcmd $TESTPOOL mounted && zfs $mountcmd $TESTPOOL
return 0 return 0
} }
@ -50,13 +52,25 @@ force_unmount $fs
log_note "Verify mount(8) does not canonicalize before calling helper" log_note "Verify mount(8) does not canonicalize before calling helper"
# Canonicalization is confused by files in PWD matching [device|mountpoint] # Canonicalization is confused by files in PWD matching [device|mountpoint]
mkdir -p $TESTDIR/$$/$TESTPOOL && cd $TESTDIR/$$ || log_fail log_must mkdir -p $TESTDIR/$$/$TESTPOOL
log_must cd $TESTDIR/$$
# The env flag directs zfs to exec /bin/mount, which then calls helper # The env flag directs zfs to exec /bin/mount, which then calls helper
log_must eval ZFS_MOUNT_HELPER=1 zfs $mountcmd -v $TESTPOOL log_must eval ZFS_MOUNT_HELPER=1 zfs $mountcmd -v $TESTPOOL
# mount (2.35.2) still suffers from a cosmetic PWD prefix bug # mount (2.35.2) still suffers from a cosmetic PWD prefix bug
log_must mounted $TESTPOOL log_must mounted $TESTPOOL
force_unmount $TESTPOOL force_unmount $TESTPOOL
log_note "Verify CWD prefix filter <dataset> <path>"
log_must cd /
log_must zfs set mountpoint=legacy $TESTPOOL
log_must mkdir -p $mntpoint
log_must mount -t zfs $TESTPOOL $mntpoint
log_must ismounted $TESTPOOL
log_must umount $mntpoint
log_must zfs set mountpoint=$mntpoint $TESTPOOL
log_must cd -
force_unmount $TESTPOOL
log_note "Verify '-f <dataset> <path>' fakemount" log_note "Verify '-f <dataset> <path>' fakemount"
log_must $helper -f $fs $mntpoint log_must $helper -f $fs $mntpoint
log_mustnot ismounted $fs log_mustnot ismounted $fs
@ -75,4 +89,4 @@ log_note "Verify '<device> <path>'"
log_must $helper ${vdevs[0]} $mntpoint log_must $helper ${vdevs[0]} $mntpoint
log_must mounted $mntpoint log_must mounted $mntpoint
log_pass "zfs mount helper correctly handles both device and pool strings" log_pass "zfs mount helper correctly handles both device and pool strings"