*BSD News Article 61194


Return to BSD News archive

Newsgroups: comp.bugs.2bsd
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!nntp.coast.net!chi-news.cic.net!news.wctc.net!news.new-york.net!wlbr!sms
From: sms@wlv.iipo.gtegsc.com (Steven M. Schultz)
Subject: extra sprintf in quota(1), missing MNT_QUOTAS in mntopts.h (#303)
Sender: news@wlbr.iipo.gtegsc.com (System Administrator)
Organization: GTE Government Systems, Thousand Oaks CA USA
Message-ID: <DMLJH2.MKJ@wlbr.iipo.gtegsc.com>
X-Nntp-Posting-Host: wlv.iipo.gtegsc.com
Date: Sun, 11 Feb 1996 05:34:14 GMT
Lines: 210

Subject: extra sprintf in quota(1), missing MNT_QUOTAS in mntopts.h (#303)
Index:	mount/mntopts.h,ucb/quota.c 2.11BSD

Description:
	mount(8) complains about illegal option "quotas" if the new
	style fstab(5) format is used and quotas are enabled.

	quota(1) always reports "no quota" even if quotas are enabled
	and a quota has been assigned to a user id.

Repeat-By:
	Have an entry of the form:

/dev/ra0f	/user	ufs	rw,quotas 1	4

	present in /etc/fstab.  Note the error from 'mount'.

	Have quotas enabled and assigned for a user.  Use 'quota' and
	note that the response is "Disk quotas for ... (none)"

Fix:
	The first problem was caused by paying too much attention to the
	compatibility mode in the parsing of /etc/fstab.  The old "rq"
	would be correctly handled but the newer "quotas" option was
	inadvertently omitted.  Oops ;-)

	In the second case too much code was cut and pasted - the 'hasquota'
	routine generated the correct pathname.   The calling routine then
	prepended the mount point name resulting in the quota file being
	called something like "/users/users/quotas" which didn't exist, thus
	no quotas were ever reported.

	Cut where indicated, saving to a file (/tmp/303) and then:

		patch -p0 < /tmp/303
		cd /usr/src/etc/mount
		make
		make install
		make clean
		cd /usr/src/ucb
		make quota
		install -s -m 4755 quota /usr/ucb/quota

------------------------------cut here------------------------------
*** /usr/src/etc/mount/mntopts.h.old	Wed Jan 24 23:32:57 1996
--- /usr/src/etc/mount/mntopts.h	Wed Feb  7 22:58:58 1996
***************
*** 30,36 ****
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   *
!  *	@(#)mntopts.h	8.3.1 (2.11BSD) 1996/1/16
   */
  
  struct mntopt {
--- 30,36 ----
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   *
!  *	@(#)mntopts.h	8.3.2 (2.11BSD) 1996/2/7
   */
  
  struct mntopt {
***************
*** 46,51 ****
--- 46,52 ----
  #define MOPT_NOSUID		{ "suid",	1, MNT_NOSUID }
  #define MOPT_RDONLY		{ "rdonly",	0, MNT_RDONLY }
  #define MOPT_SYNC		{ "sync",	0, MNT_SYNCHRONOUS }
+ #define	MOPT_QUOTAS		{ "quotas",	0, 0 }
  
  /* Control flags. */
  #define MOPT_FORCE		{ "force",	1, MNT_FORCE }
***************
*** 56,69 ****
  #define MOPT_RW			{ "rw",		1, MNT_RDONLY }
  #define MOPT_RQ			{ "rq",		1, MNT_RDONLY }
  
  #define MOPT_FSTAB_COMPAT						\
  	MOPT_RO,							\
  	MOPT_RW,							\
! 	MOPT_RQ
  
  /* Standard options which all mounts can understand. */
  #define MOPT_STDOPTS							\
  	MOPT_FSTAB_COMPAT,						\
  	MOPT_NODEV,							\
  	MOPT_NOEXEC,							\
  	MOPT_NOSUID,							\
--- 57,77 ----
  #define MOPT_RW			{ "rw",		1, MNT_RDONLY }
  #define MOPT_RQ			{ "rq",		1, MNT_RDONLY }
  
+ /* Ignored options (used for control in fstab) */
+ #define	MOPT_AUTO		{ "auto", }
+ #define	MOPT_NOAUTO		{ "na",	}
+ 
  #define MOPT_FSTAB_COMPAT						\
  	MOPT_RO,							\
  	MOPT_RW,							\
! 	MOPT_RQ,							\
! 	MOPT_NOAUTO,							\
! 	MOPT_AUTO
  
  /* Standard options which all mounts can understand. */
  #define MOPT_STDOPTS							\
  	MOPT_FSTAB_COMPAT,						\
+ 	MOPT_QUOTAS,							\
  	MOPT_NODEV,							\
  	MOPT_NOEXEC,							\
  	MOPT_NOSUID,							\
*** /usr/src/ucb/quota.c.old	Sun Jan 21 17:40:15 1996
--- /usr/src/ucb/quota.c	Wed Feb  7 23:27:08 1996
***************
*** 9,15 ****
  "@(#) Copyright (c) 1980 Regents of the University of California.\n\
   All rights reserved.\n";
  
! static char sccsid[] = "@(#)quota.c	5.4.2 (2.11BSD GTE) 1996/1/21";
  #endif
  
  /*
--- 9,15 ----
  "@(#) Copyright (c) 1980 Regents of the University of California.\n\
   All rights reserved.\n";
  
! static char sccsid[] = "@(#)quota.c	5.4.3 (2.11BSD GTE) 1996/2/7";
  #endif
  
  /*
***************
*** 113,119 ****
  	char *qfpathname;
  	struct	dqblk dqblk;
  	int myuid, fd;
! 	char qfilename[MAXPATHLEN + 1], iwarn[8], dwarn[8];
  
  	myuid = getuid();
  	if (uid != myuid && myuid != 0) {
--- 113,119 ----
  	char *qfpathname;
  	struct	dqblk dqblk;
  	int myuid, fd;
! 	char iwarn[8], dwarn[8];
  
  	myuid = getuid();
  	if (uid != myuid && myuid != 0) {
***************
*** 130,136 ****
  		if (stat(fs->fs_spec, &statb) < 0)
  			continue;
  		msgi = msgb = (char *) 0;
- 		(void) sprintf(qfilename, "%s/%s", fs->fs_file, qfpathname);
  /*
   * This check for the quota file being in the filesystem to which the quotas
   * belong is silly but the kernel enforces it.   When the kernel is fixed the
--- 130,135 ----
***************
*** 137,146 ****
   * check can be removed.
  */
  		fsdev = statb.st_rdev;
! 		if (stat(qfilename, &statb) < 0 || statb.st_dev != fsdev)
  			continue;
  		if (quota(Q_GETDLIM, uid, fsdev, (caddr_t)&dqblk)) {
! 			fd = open(qfilename, O_RDONLY);
  			if (fd < 0)
  				continue;
  			(void) lseek(fd, (off_t)(uid * sizeof (dqblk)), L_SET);
--- 136,145 ----
   * check can be removed.
  */
  		fsdev = statb.st_rdev;
! 		if (stat(qfpathname, &statb) < 0 || statb.st_dev != fsdev)
  			continue;
  		if (quota(Q_GETDLIM, uid, fsdev, (caddr_t)&dqblk)) {
! 			fd = open(qfpathname, O_RDONLY);
  			if (fd < 0)
  				continue;
  			(void) lseek(fd, (off_t)(uid * sizeof (dqblk)), L_SET);
***************
*** 163,169 ****
  
  			default:		/* ERROR */
  				fprintf(stderr, "quota: read error in ");
! 				perror(qfilename);
  				(void) close(fd);
  				continue;
  			}
--- 162,168 ----
  
  			default:		/* ERROR */
  				fprintf(stderr, "quota: read error in ");
! 				perror(qfpathname);
  				(void) close(fd);
  				continue;
  			}
*** /VERSION.old	Wed Feb  7 20:16:05 1996
--- /VERSION	Wed Feb  7 23:29:24 1996
***************
*** 1,4 ****
! Current Patch Level: 302
  
  2.11 BSD
  ============
--- 1,4 ----
! Current Patch Level: 303
  
  2.11 BSD
  ============