• ChenXiaoSong's avatar
    xfs: fix NULL pointer dereference in xfs_getbmap() · 001c179c
    ChenXiaoSong authored
    Reproducer:
     1. fallocate -l 100M image
     2. mkfs.xfs -f image
     3. mount image /mnt
     4. setxattr("/mnt", "trusted.overlay.upper", NULL, 0, XATTR_CREATE)
     5. char arg[32] = "\x01\xff\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00"
                       "\x00\x00\x00\x00\x00\x08\x00\x00\x00\xc6\x2a\xf7";
        fd = open("/mnt", O_RDONLY|O_DIRECTORY);
        ioctl(fd, _IOC(_IOC_READ|_IOC_WRITE, 0x58, 0x2c, 0x20), arg);
    
    NULL pointer dereference will occur when race happens between xfs_getbmap()
    and xfs_bmap_set_attrforkoff():
    
             ioctl               |       setxattr
     ----------------------------|---------------------------
     xfs_getbmap                 |
       xfs_ifork_ptr             |
         xfs_inode_has_attr_fork |
           ip->i_forkoff == 0    |
         return NULL             |
       ifp == NULL               |
                                 | xfs_bmap_set_attrforkoff
                                 |   ip->i_forkoff > 0
       xfs_inode_has_attr_fork   |
         ip->i_forkoff > 0       |
       ifp == NULL               |
       ifp->if_format            |
    
    Fix this by locking i_lock before xfs_ifork_ptr().
    
    Fixes: abbf9e8a ("xfs: rewrite getbmap using the xfs_iext_* helpers")
    Signed-off-by: default avatarChenXiaoSong <chenxiaosong2@huawei.com>
    Signed-off-by: default avatarGuo Xuenan <guoxuenan@huawei.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    [djwong: added fixes tag]
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    001c179c
xfs_bmap_util.c 48.3 KB