Author: cem
Date: Mon Apr 16 19:33:04 2018
New Revision: 332632
URL: https://svnweb.freebsd.org/changeset/base/332632

Log:
  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

Modified:
  head/usr.bin/quota/quota.c

Modified: head/usr.bin/quota/quota.c
==============================================================================
--- head/usr.bin/quota/quota.c  Mon Apr 16 18:12:15 2018        (r332631)
+++ head/usr.bin/quota/quota.c  Mon Apr 16 19:33:04 2018        (r332632)
@@ -621,14 +621,14 @@ getnfsquota(struct statfs *fst, struct quotause *qup, 
                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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to