NFSv4 gladly accepts and mounts "hostname:path" instead of "hostname:/path". This causes mount entry mistmatch between /etc/mtab and /proc/mounts files. The former will have "hostname:path" but the latter will have "hostname:/path". This causes umount not work at all. Signed-off-by: Malahal Naineni <malahal@xxxxxxxxxx> --- utils/mount/stropts.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index d52e21a..559114d 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -571,6 +571,7 @@ static int nfs_sys_mount(struct nfsmount_info *mi, struct mount_options *opts) { char *options = NULL; int result; + char *dirname; if (mi->fake) return 1; @@ -580,6 +581,27 @@ static int nfs_sys_mount(struct nfsmount_info *mi, struct mount_options *opts) return 0; } + /* + * Make sure that dirname in the spec starts with '/'. The mount + * works fine in NFSv4 without the '/', but then /etc/mtab and + * /proc/mounts disagree on the actual mount entry causing later + * umount to fail! There is no reason to allow any dirname not + * starting with '/', so fail it here. + * + * Note that for NFSv2 and NFSv3, the mount call itself fails if + * dirname doesn't start with '/'. So this check is only useful + * for NFSv4. + */ + dirname = strchr(mi->spec, ']'); /* IPv6 address check */ + if (dirname) + dirname = strchr(dirname+1, ':'); + else + dirname = strchr(mi->spec, ':'); + if (!dirname || *(dirname+1) != '/') { + errno = EINVAL; + return 0; + } + result = mount(mi->spec, mi->node, mi->type, mi->flags & ~(MS_USER|MS_USERS), options); free(options); -- 1.7.8.3 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html