Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs fixes from Al Viro: "A couple of regression fixes" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: fix iov_iter_advance() for ITER_PIPE xattr: Fix setting security xattrs on sockfs
This commit is contained in:
commit
bec1b089ab
22
fs/xattr.c
22
fs/xattr.c
|
@ -170,7 +170,7 @@ int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
|
|||
const void *value, size_t size, int flags)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
int error = -EOPNOTSUPP;
|
||||
int error = -EAGAIN;
|
||||
int issec = !strncmp(name, XATTR_SECURITY_PREFIX,
|
||||
XATTR_SECURITY_PREFIX_LEN);
|
||||
|
||||
|
@ -183,15 +183,21 @@ int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
|
|||
security_inode_post_setxattr(dentry, name, value,
|
||||
size, flags);
|
||||
}
|
||||
} else if (issec) {
|
||||
const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
|
||||
|
||||
} else {
|
||||
if (unlikely(is_bad_inode(inode)))
|
||||
return -EIO;
|
||||
error = security_inode_setsecurity(inode, suffix, value,
|
||||
size, flags);
|
||||
if (!error)
|
||||
fsnotify_xattr(dentry);
|
||||
}
|
||||
if (error == -EAGAIN) {
|
||||
error = -EOPNOTSUPP;
|
||||
|
||||
if (issec) {
|
||||
const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
|
||||
|
||||
error = security_inode_setsecurity(inode, suffix, value,
|
||||
size, flags);
|
||||
if (!error)
|
||||
fsnotify_xattr(dentry);
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
|
|
|
@ -683,10 +683,11 @@ static void pipe_advance(struct iov_iter *i, size_t size)
|
|||
struct pipe_inode_info *pipe = i->pipe;
|
||||
struct pipe_buffer *buf;
|
||||
int idx = i->idx;
|
||||
size_t off = i->iov_offset;
|
||||
size_t off = i->iov_offset, orig_sz;
|
||||
|
||||
if (unlikely(i->count < size))
|
||||
size = i->count;
|
||||
orig_sz = size;
|
||||
|
||||
if (size) {
|
||||
if (off) /* make it relative to the beginning of buffer */
|
||||
|
@ -713,6 +714,7 @@ static void pipe_advance(struct iov_iter *i, size_t size)
|
|||
pipe->nrbufs--;
|
||||
}
|
||||
}
|
||||
i->count -= orig_sz;
|
||||
}
|
||||
|
||||
void iov_iter_advance(struct iov_iter *i, size_t size)
|
||||
|
|
15
net/socket.c
15
net/socket.c
|
@ -341,8 +341,23 @@ static const struct xattr_handler sockfs_xattr_handler = {
|
|||
.get = sockfs_xattr_get,
|
||||
};
|
||||
|
||||
static int sockfs_security_xattr_set(const struct xattr_handler *handler,
|
||||
struct dentry *dentry, struct inode *inode,
|
||||
const char *suffix, const void *value,
|
||||
size_t size, int flags)
|
||||
{
|
||||
/* Handled by LSM. */
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
static const struct xattr_handler sockfs_security_xattr_handler = {
|
||||
.prefix = XATTR_SECURITY_PREFIX,
|
||||
.set = sockfs_security_xattr_set,
|
||||
};
|
||||
|
||||
static const struct xattr_handler *sockfs_xattr_handlers[] = {
|
||||
&sockfs_xattr_handler,
|
||||
&sockfs_security_xattr_handler,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue