fs: Call security_ops->inode_killpriv on truncate

Comment in include/linux/security.h says that ->inode_killpriv() should
be called when setuid bit is being removed and that similar security
labels (in fact this applies only to file capabilities) should be
removed at this time as well. However we don't call ->inode_killpriv()
when we remove suid bit on truncate.

We fix the problem by calling ->inode_need_killpriv() and subsequently
->inode_killpriv() on truncate the same way as we do it on file write.

After this patch there's only one user of should_remove_suid() - ocfs2 -
and indeed it's buggy because it doesn't call ->inode_killpriv() on
write. However fixing it is difficult because of special locking
constraints.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Jan Kara
2015-05-21 16:05:55 +02:00
committed by Al Viro
parent dbfae0cdcd
commit 45f147a1bc
3 changed files with 11 additions and 6 deletions

View File

@@ -1678,9 +1678,8 @@ EXPORT_SYMBOL(should_remove_suid);
* response to write or truncate. Return 0 if nothing has to be changed.
* Negative value on error (change should be denied).
*/
int file_needs_remove_privs(struct file *file)
int dentry_needs_remove_privs(struct dentry *dentry)
{
struct dentry *dentry = file->f_path.dentry;
struct inode *inode = d_inode(dentry);
int mask = 0;
int ret;
@@ -1696,7 +1695,7 @@ int file_needs_remove_privs(struct file *file)
mask |= ATTR_KILL_PRIV;
return mask;
}
EXPORT_SYMBOL(file_needs_remove_privs);
EXPORT_SYMBOL(dentry_needs_remove_privs);
static int __remove_privs(struct dentry *dentry, int kill)
{