ext4: store maxbytes for bitmapped files and return EFBIG as appropriate
Calculate & store the max offset for bitmapped files, and catch too-large seeks, truncates, and writes in ext4, shortening or rejecting as appropriate. Signed-off-by: Eric Sandeen <sandeen@redhat.com>
This commit is contained in:
committed by
Theodore Ts'o
parent
19295529db
commit
e2b4657453
@@ -56,8 +56,25 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
ssize_t ret;
|
||||
int err;
|
||||
|
||||
ret = generic_file_aio_write(iocb, iov, nr_segs, pos);
|
||||
/*
|
||||
* If we have encountered a bitmap-format file, the size limit
|
||||
* is smaller than s_maxbytes, which is for extent-mapped files.
|
||||
*/
|
||||
|
||||
if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) {
|
||||
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
||||
size_t length = iov_length(iov, nr_segs);
|
||||
|
||||
if (pos > sbi->s_bitmap_maxbytes)
|
||||
return -EFBIG;
|
||||
|
||||
if (pos + length > sbi->s_bitmap_maxbytes) {
|
||||
nr_segs = iov_shorten((struct iovec *)iov, nr_segs,
|
||||
sbi->s_bitmap_maxbytes - pos);
|
||||
}
|
||||
}
|
||||
|
||||
ret = generic_file_aio_write(iocb, iov, nr_segs, pos);
|
||||
/*
|
||||
* Skip flushing if there was an error, or if nothing was written.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user