• Dave Chinner's avatar
    xfs: prevent bogus assert when trying to remove non-existent attribute · 4a338212
    Dave Chinner authored
    If the attribute fork on an inode is in btree format and has
    multiple levels (i.e node format rather than leaf format), then a
    lookup failure will trigger an assert failure in xfs_da_path_shift
    if the flag XFS_DA_OP_OKNOENT is not set. This flag is used to
    indicate to the directory btree code that not finding an entry is
    not a fatal error. In the case of doing a lookup for a directory
    name removal, this is valid as a user cannot insert an arbitrary
    name to remove from the directory btree.
    
    However, in the case of the attribute tree, a user has direct
    control over the attribute name and can ask for any random name to
    be removed without any validation. In this case, fsstress is asking
    for a non-existent user.selinux attribute to be removed, and that is
    causing xfs_da_path_shift() to fall off the bottom of the tree where
    it asserts that a lookup failure is allowed. Because the flag is not
    set, we die a horrible death on a debug enable kernel.
    
    Prevent this assert from firing on attribute removes by adding the
    op_flag XFS_DA_OP_OKNOENT to atribute removal operations.
    
    Discovered when testing on a SELinux enabled system by fsstress in
    test 070 by trying to remove a non-existent user.selinux attribute.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
    4a338212
xfs_attr.c 55.8 KB