bin/84298: [patch] allow mount(8) to recognize relative pathnames as mountpoints

Mikolaj Rydzewski miki at ma.krakow.pl
Fri Jul 29 12:50:21 GMT 2005


>Number:         84298
>Category:       bin
>Synopsis:       [patch] allow mount(8) to recognize relative pathnames as mountpoints
>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 Jul 29 12:50:19 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Mikolaj Rydzewski
>Release:        FreeBSD 5.4-RELEASE-p5 i386
>Organization:
>Environment:
System: FreeBSD k2.ma.krakow.pl 5.4-RELEASE-p5 FreeBSD 5.4-RELEASE-p5 #3: Tue Jul 26 13:11:08 CEST 2005 miki at k2.ma.krakow.pl:/usr/src/sys/i386/compile/K2 i386


>Description:
	Current version of mount(8) requires to specify absolute mountpoint
	pathname. Let's assume one has some mountpoints located in /mnt:
	/mnt/cdrom, /mnt/floppy, /mnt/usb
	It should be possible to call mount(8) like this:
	mount cdrom (assuming the current directory is /mnt). It has
	more practical impact when system is configured to allow non-root
	users to mount (cdroms, usb sticks) to mountpoints in their home
	directories. It's much more flexible to run mount ~/usb than 
	mount /home/<username>/usb.
	And last but not least ;-) mount(8) is supposed to behave in such
	way - there's a correct call to realpath(3), but infortunately
	previous function checks mountpoint validity without using
	realpath(3) call.
	So my patch just polishes existing code.
>How-To-Repeat:
	Try to mount a filesystem using non absolute path name - an error
	will occur.
>Fix:
	Apply attached patch.

--- mount_patch begins here ---
diff -Nru sbin/mount.old/getmntopts.c sbin/mount/getmntopts.c
--- sbin/mount.old/getmntopts.c	Fri Jul 29 13:55:33 2005
+++ sbin/mount/getmntopts.c	Fri Jul 29 14:08:03 2005
@@ -140,3 +140,18 @@
 	} else
 		errx(EX_USAGE, "%s: %s", resolved, strerror(errno));
 }
+
+const char *
+getrealpath(path, resolved)
+	const char *path;
+	char *resolved;
+{
+	struct stat sb;
+
+	if (realpath(path, resolved) != NULL
+		&& stat(resolved, &sb) == 0
+		&& S_ISDIR(sb.st_mode))
+		return resolved;
+
+	return path;
+}
diff -Nru sbin/mount.old/mntopts.h sbin/mount/mntopts.h
--- sbin/mount.old/mntopts.h	Fri Jul 29 13:55:33 2005
+++ sbin/mount/mntopts.h	Fri Jul 29 14:07:15 2005
@@ -91,4 +91,5 @@
 void getmntopts(const char *, const struct mntopt *, int *, int *);
 void rmslashes(char *, char *);
 void checkpath(const char *, char resolved_path[]);
+const char* getrealpath(const char *, char resolved_path[]);
 extern int getmnt_silent;
diff -Nru sbin/mount.old/mount.c sbin/mount/mount.c
--- sbin/mount.old/mount.c	Fri Jul 29 13:55:33 2005
+++ sbin/mount/mount.c	Fri Jul 29 14:12:42 2005
@@ -126,13 +126,14 @@
 	int argc;
 	char * const argv[];
 {
-	const char *mntfromname, **vfslist, *vfstype;
+	const char *mntfromname, **vfslist, *vfstype, *mntpath_ptr;
 	struct fstab *fs;
 	struct statfs *mntbuf;
 	FILE *mountdfp;
 	pid_t pid;
 	int all, ch, i, init_flags, mntsize, rval, have_fstab;
 	char *cp, *ep, *options;
+	char mntpath[PATH_MAX];
 
 	all = init_flags = 0;
 	options = NULL;
@@ -271,8 +272,9 @@
 			    mntbuf->f_mntonname, init_flags, options, 0);
 			break;
 		}
-		if ((fs = getfsfile(*argv)) == NULL &&
-		    (fs = getfsspec(*argv)) == NULL)
+		mntpath_ptr = getrealpath(*argv, mntpath);
+		if ((fs = getfsfile(mntpath_ptr)) == NULL &&
+		    (fs = getfsspec(mntpath_ptr)) == NULL)
 			errx(1, "%s: unknown special file or file system",
 			    *argv);
 		if (BADTYPE(fs->fs_type))
--- mount_patch ends here ---


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


More information about the freebsd-bugs mailing list