summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2007-09-10 14:12:29 +0000
committerbz <bz@FreeBSD.org>2007-09-10 14:12:29 +0000
commit621c3a5b992a9ef132abccc3efaeaba8233012f6 (patch)
tree2647fca2d884ba22085faf39c73afa72116f7952 /sys/ufs
parent28b3aed3c3a6cc31fb990c4bc8edadf186ad2c37 (diff)
downloadFreeBSD-src-621c3a5b992a9ef132abccc3efaeaba8233012f6.zip
FreeBSD-src-621c3a5b992a9ef132abccc3efaeaba8233012f6.tar.gz
Fix a DIV0 in case a large value for fs_avgfilesize or fs_avgfpdir
is given (with newfs or tunefs) and dirsize overflows. In case dirsize is <= 0 because of an overflow set maxcontigdirs to 0 so it will be 1 later. This is what would happen for large fs_avgfilesize. [1] Identified with help from: roberto, pjd Submitted by: pjd [1] Approved by: re (rwatson) MFC after: 8 days
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_alloc.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 00e0fbd..16f9396 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -1073,7 +1073,10 @@ ffs_dirpref(pip)
curdirsize = avgndir ? (cgsize - avgbfree * fs->fs_bsize) / avgndir : 0;
if (dirsize < curdirsize)
dirsize = curdirsize;
- maxcontigdirs = min((avgbfree * fs->fs_bsize) / dirsize, 255);
+ if (dirsize <= 0)
+ maxcontigdirs = 0; /* dirsize overflowed */
+ else
+ maxcontigdirs = min((avgbfree * fs->fs_bsize) / dirsize, 255);
if (fs->fs_avgfpdir > 0)
maxcontigdirs = min(maxcontigdirs,
fs->fs_ipg / fs->fs_avgfpdir);
OpenPOWER on IntegriCloud