Skip to content

Commit

Permalink
FFS: truncate write if it would exceed the fs max file size or RLIMIT…
Browse files Browse the repository at this point in the history
…_FSIZE

PR:	164793
Reviewed by:	asomers, jah, markj
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
Differential revision:	https://reviews.freebsd.org/D36625
  • Loading branch information
kostikbel committed Sep 24, 2022
1 parent 1b4b751 commit 87525ef
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions sys/ufs/ffs/ffs_vnops.c
Original file line number Diff line number Diff line change
Expand Up @@ -839,7 +839,7 @@ ffs_write(
struct buf *bp;
ufs_lbn_t lbn;
off_t osize;
ssize_t resid;
ssize_t resid, r;
int seqcount;
int blkoffset, error, flags, ioflag, size, xfersize;

Expand Down Expand Up @@ -888,15 +888,17 @@ ffs_write(
KASSERT(uio->uio_resid >= 0, ("ffs_write: uio->uio_resid < 0"));
KASSERT(uio->uio_offset >= 0, ("ffs_write: uio->uio_offset < 0"));
fs = ITOFS(ip);
if ((uoff_t)uio->uio_offset + uio->uio_resid > fs->fs_maxfilesize)
return (EFBIG);

/*
* Maybe this should be above the vnode op call, but so long as
* file servers have no limits, I don't think it matters.
*/
error = vn_rlimit_fsize(vp, uio, uio->uio_td);
if (error != 0)
error = vn_rlimit_fsizex(vp, uio, fs->fs_maxfilesize, &r,
uio->uio_td);
if (error != 0) {
vn_rlimit_fsizex_res(uio, r);
return (error);
}

resid = uio->uio_resid;
osize = ip->i_size;
Expand Down Expand Up @@ -1037,6 +1039,7 @@ ffs_write(
if (ffs_fsfail_cleanup(VFSTOUFS(vp->v_mount), error))
error = ENXIO;
}
vn_rlimit_fsizex_res(uio, r);
return (error);
}

Expand Down

0 comments on commit 87525ef

Please sign in to comment.