X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fs%2Fsplice.c;h=6bdcb6107bc3c55b58199537e2eb5537133cd460;hb=3514faca19a6fdc209734431c509631ea92b094e;hp=59a941d404d9c60b46a83ced4472ee915a7fe93c;hpb=92d15c2ccbb3e31a3fc71ad28fdb55e1319383c0;p=~andy%2Flinux diff --git a/fs/splice.c b/fs/splice.c index 59a941d404d..6bdcb6107bc 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -824,13 +824,18 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, { struct address_space *mapping = out->f_mapping; struct inode *inode = mapping->host; + int killsuid, killpriv; ssize_t ret; - int err; + int err = 0; - err = should_remove_suid(out->f_path.dentry); - if (unlikely(err)) { + killpriv = security_inode_need_killpriv(out->f_path.dentry); + killsuid = should_remove_suid(out->f_path.dentry); + if (unlikely(killsuid || killpriv)) { mutex_lock(&inode->i_mutex); - err = __remove_suid(out->f_path.dentry, err); + if (killpriv) + err = security_inode_killpriv(out->f_path.dentry); + if (!err && killsuid) + err = __remove_suid(out->f_path.dentry, killsuid); mutex_unlock(&inode->i_mutex); if (err) return err;