• Yuezhang Mo's avatar
    exfat: fix reporting fs error when reading dir beyond EOF · 706fdcac
    Yuezhang Mo authored
    Since seekdir() does not check whether the position is valid, the
    position may exceed the size of the directory. We found that for
    a directory with discontinuous clusters, if the position exceeds
    the size of the directory and the excess size is greater than or
    equal to the cluster size, exfat_readdir() will return -EIO,
    causing a file system error and making the file system unavailable.
    
    Reproduce this bug by:
    
    seekdir(dir, dir_size + cluster_size);
    dirent = readdir(dir);
    
    The following log will be printed if mount with 'errors=remount-ro'.
    
    [11166.712896] exFAT-fs (sdb1): error, invalid access to FAT (entry 0xffffffff)
    [11166.712905] exFAT-fs (sdb1): Filesystem has been set read-only
    
    Fixes: 1e5654de ("exfat: handle wrong stream entry size in exfat_readdir()")
    Cc: stable@vger.kernel.org # v5.7+
    Signed-off-by: default avatarYuezhang Mo <Yuezhang.Mo@sony.com>
    Reviewed-by: default avatarAndy Wu <Andy.Wu@sony.com>
    Reviewed-by: default avatarAoyama Wataru <wataru.aoyama@sony.com>
    Reviewed-by: default avatarSungjong Seo <sj1557.seo@samsung.com>
    Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
    706fdcac
dir.c 28.6 KB