NetBSD 1.0 PATCH #5 INDEX DESCRIPTION ----- ----------- patch_05 Be more careful with maximum file sizes, to avoid serious file system bugs. Affects: src/sys/ufs/ffs/ffs_inode.c src/sys/ufs/ffs/ffs_vfsops.c src/sys/ufs/ufs/ufs_vnops.c diff -c src/sys/ufs/ffs/ffs_inode.c:1.5.2.1 src/sys/ufs/ffs/ffs_inode.c:1.5.2.2 *** src/sys/ufs/ffs/ffs_inode.c:1.5.2.1 Wed Nov 23 02:53:27 1994 --- src/sys/ufs/ffs/ffs_inode.c Wed Nov 23 02:53:28 1994 *************** *** 1,4 **** ! /* $NetBSD: ffs_inode.c,v 1.5.2.1 1994/10/19 04:29:45 cgd Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 --- 1,4 ---- ! /* $NetBSD: ffs_inode.c,v 1.5.2.2 1994/11/23 08:18:33 cgd Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 *************** *** 163,170 **** int aflags, error, allerror; off_t osize; - if (length < 0 || length > 0xffffffffLL) - return (EINVAL); oip = VTOI(ovp); tv = time; if (ovp->v_type == VLNK && --- 163,168 ---- *************** *** 194,202 **** /* * Lengthen the size of the file. We must ensure that the * last byte of the file is allocated. Since the smallest ! * value of oszie is 0, length will be at least 1. */ if (osize < length) { offset = blkoff(fs, length - 1); lbn = lblkno(fs, length - 1); aflags = B_CLRBUF; --- 192,202 ---- /* * Lengthen the size of the file. We must ensure that the * last byte of the file is allocated. Since the smallest ! * value of osize is 0, length will be at least 1. */ if (osize < length) { + if (length > fs->fs_maxfilesize) + return (EFBIG); offset = blkoff(fs, length - 1); lbn = lblkno(fs, length - 1); aflags = B_CLRBUF; diff -c src/sys/ufs/ffs/ffs_vfsops.c:1.4 src/sys/ufs/ffs/ffs_vfsops.c:1.4.2.1 *** src/sys/ufs/ffs/ffs_vfsops.c:1.4 Wed Nov 23 02:53:32 1994 --- src/sys/ufs/ffs/ffs_vfsops.c Wed Nov 23 02:53:33 1994 *************** *** 1,4 **** ! /* $NetBSD: ffs_vfsops.c,v 1.4 1994/06/29 06:46:37 cgd Exp $ */ /* * Copyright (c) 1989, 1991, 1993, 1994 --- 1,4 ---- ! /* $NetBSD: ffs_vfsops.c,v 1.4.2.1 1994/11/23 08:49:59 cgd Exp $ */ /* * Copyright (c) 1989, 1991, 1993, 1994 *************** *** 479,484 **** --- 479,493 ---- fs->fs_qbmask = ~fs->fs_bmask; /* XXX */ fs->fs_qfmask = ~fs->fs_fmask; /* XXX */ } /* XXX */ + #ifndef KLUGE_BEGONE + { + quad_t maxfilesize; + + maxfilesize = (quad_t)0x80000000 * fs->fs_bsize - 1; + if (fs->fs_maxfilesize > maxfilesize) + fs->fs_maxfilesize = maxfilesize; + } + #endif return (0); } *************** *** 832,844 **** int blks; caddr_t space; int i, size, error = 0; bp = getblk(mp->um_devvp, SBOFF >> (fs->fs_fshift - fs->fs_fsbtodb), (int)fs->fs_sbsize, 0, 0); bcopy((caddr_t)fs, bp->b_data, (u_int)fs->fs_sbsize); /* Restore compatibility to old file systems. XXX */ if (fs->fs_postblformat == FS_42POSTBLFMT) /* XXX */ ! ((struct fs *)bp->b_data)->fs_nrpos = -1; /* XXX */ if (fs->fs_inodefmt < FS_44INODEFMT) { /* XXX */ long *lp, tmp; /* XXX */ /* XXX */ --- 841,855 ---- int blks; caddr_t space; int i, size, error = 0; + struct fs *cfs; bp = getblk(mp->um_devvp, SBOFF >> (fs->fs_fshift - fs->fs_fsbtodb), (int)fs->fs_sbsize, 0, 0); bcopy((caddr_t)fs, bp->b_data, (u_int)fs->fs_sbsize); + cfs = (struct fs *)bp->b_data; /* Restore compatibility to old file systems. XXX */ if (fs->fs_postblformat == FS_42POSTBLFMT) /* XXX */ ! cfs->fs_nrpos = -1; /* XXX */ if (fs->fs_inodefmt < FS_44INODEFMT) { /* XXX */ long *lp, tmp; /* XXX */ /* XXX */ *************** *** 848,853 **** --- 859,875 ---- lp[i] = lp[i-1]; /* XXX */ lp[0] = tmp; /* XXX */ } /* XXX */ + #ifndef KLUGE_BEGONE + { + quad_t sizepb = fs->fs_bsize; /* XXX */ + /* XXX */ + cfs->fs_maxfilesize = fs->fs_bsize * NDADDR - 1; /* XXX */ + for (i = 0; i < NIADDR; i++) { /* XXX */ + sizepb *= NINDIR(fs); /* XXX */ + cfs->fs_maxfilesize += sizepb; /* XXX */ + } /* XXX */ + } + #endif if (waitfor == MNT_WAIT) error = bwrite(bp); else diff -c src/sys/ufs/ufs/ufs_vnops.c:1.3.2.2 src/sys/ufs/ufs/ufs_vnops.c:1.3.2.3 *** src/sys/ufs/ufs/ufs_vnops.c:1.3.2.2 Wed Nov 23 02:53:51 1994 --- src/sys/ufs/ufs/ufs_vnops.c Wed Nov 23 02:53:52 1994 *************** *** 1,4 **** ! /* $NetBSD: ufs_vnops.c,v 1.3.2.2 1994/10/19 07:01:13 cgd Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 --- 1,4 ---- ! /* $NetBSD: ufs_vnops.c,v 1.3.2.3 1994/11/23 08:50:13 cgd Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 *************** *** 612,620 **** struct ucred *a_cred; } */ *ap; { - - if (ap->a_newoff < 0 || ap->a_newoff > 0xffffffffLL) - return (EINVAL); return (0); } --- 612,617 ----