]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xfs: reject unknown xattri log item operation flags during recovery
authorDarrick J. Wong <djwong@kernel.org>
Fri, 20 May 2022 04:41:47 +0000 (14:41 +1000)
committerDave Chinner <david@fromorbit.com>
Fri, 20 May 2022 04:41:47 +0000 (14:41 +1000)
Make sure we screen the op flags field of recovered xattr intent log
items to reject flag bits that we don't know about.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_attr_item.c

index 687cf517841a452eb837c6d27bf57b1b9d0fe92d..ae227a56bbedf321c173af94ce2d30403bdc67f2 100644 (file)
@@ -349,6 +349,7 @@ xfs_attr_log_item(
         */
        attrp = &attrip->attri_format;
        attrp->alfi_ino = attr->xattri_da_args->dp->i_ino;
+       ASSERT(!(attr->xattri_op_flags & ~XFS_ATTR_OP_FLAGS_TYPE_MASK));
        attrp->alfi_op_flags = attr->xattri_op_flags;
        attrp->alfi_value_len = attr->xattri_da_args->valuelen;
        attrp->alfi_name_len = attr->xattri_da_args->namelen;
@@ -496,6 +497,9 @@ xfs_attri_validate(
        if (attrp->__pad != 0)
                return false;
 
+       if (attrp->alfi_op_flags & ~XFS_ATTR_OP_FLAGS_TYPE_MASK)
+               return false;
+
        /* alfi_op_flags should be either a set or remove */
        switch (op) {
        case XFS_ATTR_OP_FLAGS_SET:
@@ -556,7 +560,8 @@ xfs_attri_item_recover(
        args = (struct xfs_da_args *)(attr + 1);
 
        attr->xattri_da_args = args;
-       attr->xattri_op_flags = attrp->alfi_op_flags;
+       attr->xattri_op_flags = attrp->alfi_op_flags &
+                                               XFS_ATTR_OP_FLAGS_TYPE_MASK;
 
        args->dp = ip;
        args->geo = mp->m_attr_geo;
@@ -567,7 +572,7 @@ xfs_attri_item_recover(
        args->attr_filter = attrp->alfi_attr_flags;
        args->op_flags = XFS_DA_OP_RECOVERY | XFS_DA_OP_OKNOENT;
 
-       switch (attrp->alfi_op_flags & XFS_ATTR_OP_FLAGS_TYPE_MASK) {
+       switch (attr->xattri_op_flags) {
        case XFS_ATTR_OP_FLAGS_SET:
        case XFS_ATTR_OP_FLAGS_REPLACE:
                args->value = attrip->attri_value;