check ATTR_SIZE contraints in inode_change_ok
Make sure we check the truncate constraints early on in ->setattr by adding those checks to inode_change_ok. Also clean up and document inode_change_ok to make this obvious. As a fallout we don't have to call inode_newsize_ok from simple_setsize and simplify it down to a truncate_setsize which doesn't return an error. This simplifies a lot of setattr implementations and means we use truncate_setsize almost everywhere. Get rid of fat_setsize now that it's trivial and mark ext2_setsize static to make the calling convention obvious. Keep the inode_newsize_ok in vmtruncate for now as all callers need an audit for its removal anyway. Note: setattr code in ecryptfs doesn't call inode_change_ok at all and needs a deeper audit, but that is left for later. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
committed by
Al Viro
parent
db78b877f7
commit
2c27c65ed0
@@ -804,10 +804,20 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
|
||||
size_t num_zeros = (PAGE_CACHE_SIZE
|
||||
- (ia->ia_size & ~PAGE_CACHE_MASK));
|
||||
|
||||
|
||||
/*
|
||||
* XXX(truncate) this should really happen at the begginning
|
||||
* of ->setattr. But the code is too messy to that as part
|
||||
* of a larger patch. ecryptfs is also totally missing out
|
||||
* on the inode_change_ok check at the beginning of
|
||||
* ->setattr while would include this.
|
||||
*/
|
||||
rc = inode_newsize_ok(inode, ia->ia_size);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
|
||||
rc = simple_setsize(inode, ia->ia_size);
|
||||
if (rc)
|
||||
goto out;
|
||||
truncate_setsize(inode, ia->ia_size);
|
||||
lower_ia->ia_size = ia->ia_size;
|
||||
lower_ia->ia_valid |= ATTR_SIZE;
|
||||
goto out;
|
||||
@@ -830,7 +840,7 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
simple_setsize(inode, ia->ia_size);
|
||||
truncate_setsize(inode, ia->ia_size);
|
||||
rc = ecryptfs_write_inode_size_to_metadata(inode);
|
||||
if (rc) {
|
||||
printk(KERN_ERR "Problem with "
|
||||
|
Reference in New Issue
Block a user