summaryrefslogtreecommitdiffstats
path: root/usr.bin/quota
diff options
context:
space:
mode:
authormpp <mpp@FreeBSD.org>2007-02-04 06:33:15 +0000
committermpp <mpp@FreeBSD.org>2007-02-04 06:33:15 +0000
commit2088a69616fcc7d02d198087f76856402c7063c4 (patch)
tree12409a8c0f64e04f52020f1914b5612c3779d48e /usr.bin/quota
parent25c9a05e1c0e7a7da4d9d9c787ab9b29d7449ae9 (diff)
downloadFreeBSD-src-2088a69616fcc7d02d198087f76856402c7063c4.zip
FreeBSD-src-2088a69616fcc7d02d198087f76856402c7063c4.tar.gz
If two files systems, /a and /b are marked as having quotas enabled
in fstab and they are normally mounted as /a/b, if /b is not mounted, the various quota utilities will incorrectly operate with the quotas on /a (silently) when operations are attemted on /b. Sync up all the hasquota() routines between all the different quota utilities and change it to detect if the file system we are attempting to perform quota operations on is not currently mounted and warn the user accordingly. PR: bin/38918
Diffstat (limited to 'usr.bin/quota')
-rw-r--r--usr.bin/quota/quota.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/usr.bin/quota/quota.c b/usr.bin/quota/quota.c
index c97fec5..6ddd7aa 100644
--- a/usr.bin/quota/quota.c
+++ b/usr.bin/quota/quota.c
@@ -483,13 +483,17 @@ getprivs(long id, int quotatype)
static int
ufshasquota(struct fstab *fs, int type, char **qfnamep)
{
+ char *opt;
+ char *cp;
+ struct statfs sfb;
static char initname, usrname[100], grpname[100];
static char buf[BUFSIZ];
- char *opt, *cp;
if (!initname) {
- sprintf(usrname, "%s%s", qfextension[USRQUOTA], qfname);
- sprintf(grpname, "%s%s", qfextension[GRPQUOTA], qfname);
+ (void)snprintf(usrname, sizeof(usrname), "%s%s",
+ qfextension[USRQUOTA], qfname);
+ (void)snprintf(grpname, sizeof(grpname), "%s%s",
+ qfextension[GRPQUOTA], qfname);
initname = 1;
}
strcpy(buf, fs->fs_mntops);
@@ -503,12 +507,22 @@ ufshasquota(struct fstab *fs, int type, char **qfnamep)
}
if (!opt)
return (0);
- if (cp) {
+ if (cp)
*qfnamep = cp;
- return (1);
+ else {
+ (void)snprintf(buf, sizeof(buf), "%s/%s.%s", fs->fs_file,
+ qfname, qfextension[type]);
+ *qfnamep = buf;
+ }
+ if (statfs(fs->fs_file, &sfb) != 0) {
+ warn("cannot statfs mount point %s", fs->fs_file);
+ return (0);
+ }
+ if (strcmp(fs->fs_file, sfb.f_mntonname)) {
+ warnx("%s not mounted for %s quotas", fs->fs_file,
+ type == USRQUOTA ? "user" : "group");
+ return (0);
}
- (void) sprintf(buf, "%s/%s.%s", fs->fs_file, qfname, qfextension[type]);
- *qfnamep = buf;
return (1);
}
OpenPOWER on IntegriCloud