Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Sep 1999 05:25:56 +0200 (CEST)
From:      Harold Gutch <logix@foobar.franken.de>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/13692: umount(8) does not unmount filesystems with a trailing slash
Message-ID:  <199909110325.FAA04567@foobar.franken.de>

next in thread | raw e-mail | index | archive | help

>Number:         13692
>Category:       bin
>Synopsis:       umount(8) does not unmount filesystems with a trailing slash
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Sep 10 20:30:01 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     Harold Gutch
>Release:        FreeBSD 2.2.8-STABLE i386
>Organization:
>Environment:

	FreeBSD 2.2.8, the bug persists in 3.x as well

>Description:

	umount(8) will not unmount a filesystem if
	a) you supply the directory-name instead of the devicenode (or
	    host:directory-combination when using NFS) as an argument
	and b) the directory on which the filesystem is mounted (member
	    f_mntonname of the struct statfs) has a trailing slash

>How-To-Repeat:

	# mount_nfs remotehost:/remote/dir /local/dir/
	# mount -t nfs
	remotehost:/remote/dir on /local/dir/
	# umount /local/dir/
	umount: /local/dir: not currently mounted
	# umount /local/dir
	umount: /local/dir: not currently mounted
	# umount remotehost:/remote/dir
	# mount -t nfs
	#

	Note: You will need to call mount_nfs, mount_cd9660, mount_msdos etc.
	directly, as mount(8) catches this and removes the trailing slash.

>Fix:
	
	Apply this patch:

--- umount.c.sav	Thu Dec  4 08:36:22 1997
+++ umount.c	Sat Sep 11 05:29:27 1999
@@ -282,23 +282,34 @@
 {
 	struct statfs *mntbuf;
 	int i, mntsize;
+	char *longname;
+
+	if (NULL == (longname = malloc(strlen(name) + 2)))
+		err(1, NULL);
+	strcpy(longname, name);
+	strcat(longname, "/");

 	if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) {
 		warn("getmntinfo");
+		free(longname);
 		return (NULL);
 	}
 	for (i = 0; i < mntsize; i++) {
 		if ((what == MNTON) && !strcmp(mntbuf[i].f_mntfromname, name)) {
 			if (type)
 				*type = mntbuf[i].f_type;
+			free(longname);
 			return (mntbuf[i].f_mntonname);
 		}
-		if ((what == MNTFROM) && !strcmp(mntbuf[i].f_mntonname, name)) {
+		if (((what == MNTFROM) && (!strcmp(mntbuf[i].f_mntonname, name))
+		    || (!strcmp(mntbuf[i].f_mntonname, longname)))) {
 			if (type)
 				*type = mntbuf[i].f_type;
+			free(longname);
 			return (mntbuf[i].f_mntfromname);
 		}
 	}
+	free(longname);
 	return (NULL);
 }


Alternatively mount_msdos, mount_cd9660 etc. need to be fixed to remove
trailing slashes.

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199909110325.FAA04567>