HomeFreeBSD

Add vn_rlimit_fsizex() and vn_rlimit_fsizex_res()

Description

Add vn_rlimit_fsizex() and vn_rlimit_fsizex_res()

The vn_rlimit_fsizex() function:

  • checks that the write does not exceed RLIMIT_FSIZE limit and fs maximum supported file size
  • truncates write length if it exceeds the RLIMIT_FSIZE or max file size, but there are some bytes to write
  • sends SIGXFSZ if RLIMIT_FSIZE would be exceed otherwise

POSIX mandates the truncated write in case when some bytes can be
written but whole write request fails the RLIMIT_FSIZE check.

The function is supposed to be used from VOP_WRITE()s. Due to
pecularity in the VFS generic write syscall layer, uio_resid must
correctly reflect the written amount (noted by markj). Provide the dual
vn_rlimit_fsizex_res() function to correct uio_resid after the clamp
done in vn_rlimit_fsizex() on VOP_WRITE() return.

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

Details

Provenance
kibAuthored on Sep 18 2022, 11:46 AM
Reviewer
asomers
Differential Revision
D36625: Improve POSIX compliance for RLIMIT_FSIZE
Parents
rGb5b16659c5ac: tmpfs: disallow truncation to set file size past RLIMIT_FSIZE
Branches
Unknown
Tags
Unknown