Fix enforcement of file size limit with O_APPEND on ZFS.

vn_rlimit_fsize takes uio->uio_offset and uio->uio_resid into account
when determining whether given write would exceed RLIMIT_FSIZE.

When APPEND flag is specified, ZFS updates uio->uio_offset to point to the
end of file.

But this happens after a call to vn_rlimit_fsize, so vn_rlimit_fsize check
can be rendered ineffective by thread that opens some file with O_APPEND
and lseeks below RLIMIT_FSIZE before calling write.

Submitted by:	Mateusz Guzik <mjguzik at gmail dot com>
MFC after:	2 weeks
This commit is contained in:
Edward Tomasz Napierala 2012-05-22 10:54:42 +00:00
parent 7d0d2b0f86
commit 9280affe16
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235781
1 changed files with 6 additions and 3 deletions

View File

@ -838,6 +838,12 @@ zfs_write(vnode_t *vp, uio_t *uio, int ioflag, cred_t *cr, caller_context_t *ct)
rl = zfs_range_lock(zp, woff, n, RL_WRITER);
}
if (vn_rlimit_fsize(vp, uio, uio->uio_td)) {
zfs_range_unlock(rl);
ZFS_EXIT(zfsvfs);
return (EFBIG);
}
if (woff >= limit) {
zfs_range_unlock(rl);
ZFS_EXIT(zfsvfs);
@ -5696,9 +5702,6 @@ zfs_freebsd_write(ap)
} */ *ap;
{
if (vn_rlimit_fsize(ap->a_vp, ap->a_uio, ap->a_uio->uio_td))
return (EFBIG);
return (zfs_write(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag),
ap->a_cred, NULL));
}