]> Git Repo - linux.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
authorLinus Torvalds <[email protected]>
Thu, 17 Nov 2016 21:49:30 +0000 (13:49 -0800)
committerLinus Torvalds <[email protected]>
Thu, 17 Nov 2016 21:49:30 +0000 (13:49 -0800)
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

fs/xattr.c
lib/iov_iter.c
net/socket.c

index 3368659c471e4f7dc8cd425738bccb7d5fec78a6..2d13b4e62faec1cd0e3ff8d5966e767821867a2c 100644 (file)
@@ -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;
index f0c7f1481baeefe30f14820ef9a2782a1541a175..f2bd21b93dfca464ae24bb18c6492bd8c7f1eb88 100644 (file)
@@ -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)
index 272518b087c883065922c40ae58397e33b90630c..73dc69f9681e7b63d3916d561812cf8419764f31 100644 (file)
@@ -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
 };
 
This page took 0.061093 seconds and 4 git commands to generate.