]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: refactor name/length checks in xfs_attri_validate
authorDarrick J. Wong <djwong@kernel.org>
Mon, 22 Apr 2024 16:47:33 +0000 (09:47 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 23 Apr 2024 14:46:54 +0000 (07:46 -0700)
Move the name and length checks into the attr op switch statement so
that we can perform more specific checks of the value length.  Over the
next few patches we're going to add new attr op flags with different
validation requirements.

While we're at it, remove the incorrect comment.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_attr_item.c

index 59723e5f483e2c00a310ab05d44a1a89cf9ef403..c8f92166b9ad65f5526c1dbf7379115f7f4e3dd3 100644 (file)
@@ -466,6 +466,12 @@ xfs_attri_item_match(
        return ATTRI_ITEM(lip)->attri_format.alfi_id == intent_id;
 }
 
+static inline bool
+xfs_attri_validate_namelen(unsigned int namelen)
+{
+       return namelen > 0 && namelen <= XATTR_NAME_MAX;
+}
+
 /* Is this recovered ATTRI format ok? */
 static inline bool
 xfs_attri_validate(
@@ -486,23 +492,24 @@ xfs_attri_validate(
        if (attrp->alfi_attr_filter & ~XFS_ATTRI_FILTER_MASK)
                return false;
 
-       /* alfi_op_flags should be either a set or remove */
        switch (op) {
        case XFS_ATTRI_OP_FLAGS_SET:
        case XFS_ATTRI_OP_FLAGS_REPLACE:
+               if (attrp->alfi_value_len > XATTR_SIZE_MAX)
+                       return false;
+               if (!xfs_attri_validate_namelen(attrp->alfi_name_len))
+                       return false;
+               break;
        case XFS_ATTRI_OP_FLAGS_REMOVE:
+               if (attrp->alfi_value_len != 0)
+                       return false;
+               if (!xfs_attri_validate_namelen(attrp->alfi_name_len))
+                       return false;
                break;
        default:
                return false;
        }
 
-       if (attrp->alfi_value_len > XATTR_SIZE_MAX)
-               return false;
-
-       if ((attrp->alfi_name_len > XATTR_NAME_MAX) ||
-           (attrp->alfi_name_len == 0))
-               return false;
-
        return xfs_verify_ino(mp, attrp->alfi_ino);
 }