aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/quota/quota.c
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2018-04-16 19:33:04 +0000
committerConrad Meyer <cem@FreeBSD.org>2018-04-16 19:33:04 +0000
commit404d2fee5650e4e7201cfd3b627d5b63619e5c73 (patch)
treea4322428cea29bd7814c653df5add68bdd08487e /usr.bin/quota/quota.c
parent52c09831285797d732af2259bc03d97696f7e98f (diff)
downloadsrc-404d2fee5650e4e7201cfd3b627d5b63619e5c73.tar.gz
src-404d2fee5650e4e7201cfd3b627d5b63619e5c73.zip
quota(1): Fix calculation overflow and underflow
For very large quotas, do the multiplication as a 64 bit value to avoid overflow. For very small block sizes (smaller than DEV_BSIZE), multiple first before dividing by block size to avoid underflow. PR: 227496 Submitted by: Per Andersson <pa AT chalmers.se> Sponsored by: Dell EMC Isilon
Notes
Notes: svn path=/head/; revision=332632
Diffstat (limited to 'usr.bin/quota/quota.c')
-rw-r--r--usr.bin/quota/quota.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/usr.bin/quota/quota.c b/usr.bin/quota/quota.c
index fc97111676d9..8e4bb8a6f400 100644
--- a/usr.bin/quota/quota.c
+++ b/usr.bin/quota/quota.c
@@ -621,14 +621,14 @@ getnfsquota(struct statfs *fst, struct quotause *qup, long id, int quotatype)
gettimeofday(&tv, NULL);
/* blocks*/
dqp->dqb_bhardlimit =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_bhardlimit *
- (gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE);
+ ((uint64_t)gq_rslt.getquota_rslt_u.gqr_rquota.rq_bhardlimit *
+ gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize) / DEV_BSIZE;
dqp->dqb_bsoftlimit =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsoftlimit *
- (gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE);
+ ((uint64_t)gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsoftlimit *
+ gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize) / DEV_BSIZE;
dqp->dqb_curblocks =
- gq_rslt.getquota_rslt_u.gqr_rquota.rq_curblocks *
- (gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE);
+ ((uint64_t)gq_rslt.getquota_rslt_u.gqr_rquota.rq_curblocks *
+ gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize) / DEV_BSIZE;
/* inodes */
dqp->dqb_ihardlimit =
gq_rslt.getquota_rslt_u.gqr_rquota.rq_fhardlimit;