orangefs: clean up oversize xattr validation
authorMartin Brandenburg <martin@omnibond.com>
Tue, 25 Apr 2017 19:37:57 +0000 (15:37 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 20 May 2017 12:28:39 +0000 (14:28 +0200)
commit e675c5ec51fe2554719a7b6bcdbef0a770f2c19b upstream.

Also don't check flags as this has been validated by the VFS already.

Fix an off-by-one error in the max size checking.

Stop logging just because userspace wants to write attributes which do
not fit.

This and the previous commit fix xfstests generic/020.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/orangefs/xattr.c

index fba4db7..237c9c0 100644 (file)
@@ -76,11 +76,8 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name,
        if (S_ISLNK(inode->i_mode))
                return -EOPNOTSUPP;
 
-       if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN) {
-               gossip_err("Invalid key length (%d)\n",
-                          (int)strlen(name));
+       if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN)
                return -EINVAL;
-       }
 
        fsuid = from_kuid(&init_user_ns, current_fsuid());
        fsgid = from_kgid(&init_user_ns, current_fsgid());
@@ -172,6 +169,9 @@ static int orangefs_inode_removexattr(struct inode *inode, const char *name,
        struct orangefs_kernel_op_s *new_op = NULL;
        int ret = -ENOMEM;
 
+       if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN)
+               return -EINVAL;
+
        down_write(&orangefs_inode->xattr_sem);
        new_op = op_alloc(ORANGEFS_VFS_OP_REMOVEXATTR);
        if (!new_op)
@@ -231,23 +231,13 @@ int orangefs_inode_setxattr(struct inode *inode, const char *name,
                     "%s: name %s, buffer_size %zd\n",
                     __func__, name, size);
 
-       if (size >= ORANGEFS_MAX_XATTR_VALUELEN ||
-           flags < 0) {
-               gossip_err("orangefs_inode_setxattr: bogus values of size(%d), flags(%d)\n",
-                          (int)size,
-                          flags);
+       if (size > ORANGEFS_MAX_XATTR_VALUELEN)
+               return -EINVAL;
+       if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN)
                return -EINVAL;
-       }
 
        internal_flag = convert_to_internal_xattr_flags(flags);
 
-       if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN) {
-               gossip_err
-                   ("orangefs_inode_setxattr: bogus key size (%d)\n",
-                    (int)(strlen(name)));
-               return -EINVAL;
-       }
-
        /* This is equivalent to a removexattr */
        if (size == 0 && value == NULL) {
                gossip_debug(GOSSIP_XATTR_DEBUG,