summaryrefslogtreecommitdiffstats
path: root/fs/inode.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2015-05-21 10:05:55 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-06-23 18:01:09 -0400
commit45f147a1bc97c743c6101a8d2741c69a51f583e4 (patch)
treeb7919ca80674bc1793b4423957f4d61c8100408d /fs/inode.c
parentdbfae0cdcd87602737101d4417811f4323156b54 (diff)
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>
Diffstat (limited to 'fs/inode.c')
-rw-r--r--fs/inode.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/inode.c b/fs/inode.c
index 8c2dd74455c9..0401d2c6d087 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1678,9 +1678,8 @@ EXPORT_SYMBOL(should_remove_suid);
1678 * response to write or truncate. Return 0 if nothing has to be changed. 1678 * response to write or truncate. Return 0 if nothing has to be changed.
1679 * Negative value on error (change should be denied). 1679 * Negative value on error (change should be denied).
1680 */ 1680 */
1681int file_needs_remove_privs(struct file *file) 1681int dentry_needs_remove_privs(struct dentry *dentry)
1682{ 1682{
1683 struct dentry *dentry = file->f_path.dentry;
1684 struct inode *inode = d_inode(dentry); 1683 struct inode *inode = d_inode(dentry);
1685 int mask = 0; 1684 int mask = 0;
1686 int ret; 1685 int ret;
@@ -1696,7 +1695,7 @@ int file_needs_remove_privs(struct file *file)
1696 mask |= ATTR_KILL_PRIV; 1695 mask |= ATTR_KILL_PRIV;
1697 return mask; 1696 return mask;
1698} 1697}
1699EXPORT_SYMBOL(file_needs_remove_privs); 1698EXPORT_SYMBOL(dentry_needs_remove_privs);
1700 1699
1701static int __remove_privs(struct dentry *dentry, int kill) 1700static int __remove_privs(struct dentry *dentry, int kill)
1702{ 1701{