From owner-freebsd-bugs@FreeBSD.ORG Sat Oct 6 19:30:01 2007 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 559E216A41B for ; Sat, 6 Oct 2007 19:30:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 2CFF013C474 for ; Sat, 6 Oct 2007 19:30:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.1/8.14.1) with ESMTP id l96JU13v038077 for ; Sat, 6 Oct 2007 19:30:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.1/8.14.1/Submit) id l96JU1VZ038076; Sat, 6 Oct 2007 19:30:01 GMT (envelope-from gnats) Resent-Date: Sat, 6 Oct 2007 19:30:01 GMT Resent-Message-Id: <200710061930.l96JU1VZ038076@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Eugene Grosbein Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A641016A417 for ; Sat, 6 Oct 2007 19:26:53 +0000 (UTC) (envelope-from eugen@grosbein.pp.ru) Received: from grosbein.pp.ru (grgw.svzserv.kemerovo.su [213.184.64.166]) by mx1.freebsd.org (Postfix) with ESMTP id C9AA313C45D for ; Sat, 6 Oct 2007 19:26:51 +0000 (UTC) (envelope-from eugen@grosbein.pp.ru) Received: from grosbein.pp.ru (localhost [127.0.0.1]) by grosbein.pp.ru (8.14.1/8.14.1) with ESMTP id l96JQmhF036307 for ; Sun, 7 Oct 2007 03:26:48 +0800 (KRAST) (envelope-from eugen@grosbein.pp.ru) Received: (from eugen@localhost) by grosbein.pp.ru (8.14.1/8.14.1/Submit) id l96JQmtE036306; Sun, 7 Oct 2007 03:26:48 +0800 (KRAST) (envelope-from eugen) Message-Id: <200710061926.l96JQmtE036306@grosbein.pp.ru> Date: Sun, 7 Oct 2007 03:26:48 +0800 (KRAST) From: Eugene Grosbein To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/116980: [patch] [msdosfs] mount_msdosfs(8) resets some flags for 'update' mount X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Oct 2007 19:30:01 -0000 >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@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: