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:
parent
7d0d2b0f86
commit
9280affe16
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235781
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue