]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: prevent a WARN_ONCE() in xfs_ioc_attr_list()
authorDan Carpenter <dan.carpenter@oracle.com>
Tue, 23 Aug 2022 12:11:31 +0000 (15:11 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 31 Aug 2022 15:15:14 +0000 (17:15 +0200)
commit 6ed6356b07714e0198be3bc3ecccc8b40a212de4 upstream.

The "bufsize" comes from the root user.  If "bufsize" is negative then,
because of type promotion, neither of the validation checks at the start
of the function are able to catch it:

if (bufsize < sizeof(struct xfs_attrlist) ||
    bufsize > XFS_XATTR_LIST_MAX)
return -EINVAL;

This means "bufsize" will trigger (WARN_ON_ONCE(size > INT_MAX)) in
kvmalloc_node().  Fix this by changing the type from int to size_t.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_ioctl.c
fs/xfs/xfs_ioctl.h

index 646735aad45df823e67a1a04fcc8520d6f7669d5..d973350d594660538f92c2286cffa5720763079b 100644 (file)
@@ -371,7 +371,7 @@ int
 xfs_ioc_attr_list(
        struct xfs_inode                *dp,
        void __user                     *ubuf,
-       int                             bufsize,
+       size_t                          bufsize,
        int                             flags,
        struct xfs_attrlist_cursor __user *ucursor)
 {
index bab6a5a924077fff1a4631bb905602a7be4a8c33..416e20de66e7dfb247935a851480d42239a4a3cd 100644 (file)
@@ -38,8 +38,9 @@ xfs_readlink_by_handle(
 int xfs_ioc_attrmulti_one(struct file *parfilp, struct inode *inode,
                uint32_t opcode, void __user *uname, void __user *value,
                uint32_t *len, uint32_t flags);
-int xfs_ioc_attr_list(struct xfs_inode *dp, void __user *ubuf, int bufsize,
-       int flags, struct xfs_attrlist_cursor __user *ucursor);
+int xfs_ioc_attr_list(struct xfs_inode *dp, void __user *ubuf,
+                     size_t bufsize, int flags,
+                     struct xfs_attrlist_cursor __user *ucursor);
 
 extern struct dentry *
 xfs_handle_to_dentry(