bin/116980: [patch] [msdosfs] mount_msdosfs(8) resets some flags
for 'update' mount
Eugene Grosbein
eugen at grosbein.pp.ru
Sat Oct 6 12:30:01 PDT 2007
>Number: 116980
>Category: bin
>Synopsis: [patch] [msdosfs] mount_msdosfs(8) resets some flags for 'update' mount
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Oct 06 19:30:00 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Eugene Grosbein
>Release: FreeBSD 6.2-STABLE i386
>Organization:
Svyaz-Service JSC
>Environment:
System: FreeBSD grosbein.pp.ru 6.2-STABLE FreeBSD 6.2-STABLE #2: Sun Sep 16 16:54:23 KRAST 2007 eu at grosbein.pp.ru:/home/obj/usr/local/src/sys/DADV i386
>Description:
"mount -t msdosfs -u -o rw" resets uid, gid, mask and dirmask
to defauls but should keep current values.
>How-To-Repeat:
1. Create FS with a file:
# dd if=/dev/zero bs=1k count=1440 of=image
# mdconfig -a -t vnode -f image
# newfs_msdos -f 1440 /dev/md0
# mount_msdosfs /dev/md0 /mnt/tmp
# touch /mnt/tmp/file
# umount /mnt/tmp
2. Mount it with convenient flags, so directories are searchable
and files are not executable, and read-only:
# mount_msdosfs -o ro -M 755 -m 644 /dev/md0 /mnt/tmp
Make sure it works, file is not executable:
# ls -l /mnt/tmp
total 0
-rw-r--r-- 1 root wheel 0 Oct 7 03:05 file
Now remount it read-write and see that mask has been reset:
# mount -u -o rw /mnt/tmp
# ls -l /mnt/tmp
total 0
-rwxr-xr-x 1 root wheel 0 Oct 7 03:05 file
>Fix:
mount_msdosfs(8) should not set defaults for update.
--- sbin/mount_msdosfs/mount_msdosfs.c.orig 2007-09-24 20:36:51.000000000 +0800
+++ sbin/mount_msdosfs/mount_msdosfs.c 2007-10-07 03:15:40.000000000 +0800
@@ -69,7 +69,7 @@
struct iovec *iov = NULL;
int iovlen = 0;
struct stat sb;
- int c, mntflags, set_gid, set_uid, set_mask, set_dirmask;
+ int c, mntflags, set_gid, set_uid, set_mask, set_dirmask, update = 0;
char *dev, *dir, mntpath[MAXPATHLEN], *csp;
char fstype[] = "msdosfs";
char *cs_dos = NULL;
@@ -133,6 +133,7 @@
*p = '\0';
val = p + 1;
}
+ update = update || !strcmp(optarg, "update");
build_iovec(&iov, &iovlen, optarg, val, -1);
}
break;
@@ -165,13 +166,15 @@
if (optind + 2 != argc)
usage();
- if (set_mask && !set_dirmask) {
- dirmask = mask;
- set_dirmask = 1;
- }
- else if (set_dirmask && !set_mask) {
- mask = dirmask;
- set_mask = 1;
+ if (!update) {
+ if (set_mask && !set_dirmask) {
+ dirmask = mask;
+ set_dirmask = 1;
+ }
+ else if (set_dirmask && !set_mask) {
+ mask = dirmask;
+ set_mask = 1;
+ }
}
dev = argv[optind];
@@ -195,26 +198,36 @@
(void)checkpath(dir, mntpath);
(void)rmslashes(dev, dev);
- if (!set_gid || !set_uid || !set_mask) {
+ if (!update && (!set_gid || !set_uid || !set_mask)) {
if (stat(mntpath, &sb) == -1)
err(EX_OSERR, "stat %s", mntpath);
-
- if (!set_uid)
+ if (!set_uid) {
uid = sb.st_uid;
- if (!set_gid)
+ set_uid = 1;
+ }
+ if (!set_gid) {
gid = sb.st_gid;
- if (!set_mask)
+ set_gid = 1;
+ }
+ if (!set_mask) {
mask = dirmask =
sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+ set_mask = set_dirmask = 1;
+ }
}
build_iovec(&iov, &iovlen, "fstype", fstype, -1);
build_iovec(&iov, &iovlen, "fspath", mntpath, -1);
build_iovec(&iov, &iovlen, "from", dev, -1);
- build_iovec_argf(&iov, &iovlen, "uid", "%d", uid);
- build_iovec_argf(&iov, &iovlen, "gid", "%u", gid);
- build_iovec_argf(&iov, &iovlen, "mask", "%u", mask);
- build_iovec_argf(&iov, &iovlen, "dirmask", "%u", dirmask);
+
+ if (set_uid)
+ build_iovec_argf(&iov, &iovlen, "uid", "%d", uid);
+ if (set_gid)
+ build_iovec_argf(&iov, &iovlen, "gid", "%u", gid);
+ if (set_mask)
+ build_iovec_argf(&iov, &iovlen, "mask", "%u", mask);
+ if (set_dirmask)
+ build_iovec_argf(&iov, &iovlen, "dirmask", "%u", dirmask);
if (nmount(iov, iovlen, mntflags) < 0)
err(1, "%s", dev);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list