]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
exfat: fix the infinite loop in exfat_find_last_cluster()
authorYuezhang Mo <Yuezhang.Mo@sony.com>
Mon, 17 Mar 2025 02:53:10 +0000 (10:53 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:39:26 +0000 (14:39 +0200)
[ Upstream commit b0522303f67255926b946aa66885a0104d1b2980 ]

In exfat_find_last_cluster(), the cluster chain is traversed until
the EOF cluster. If the cluster chain includes a loop due to file
system corruption, the EOF cluster cannot be traversed, resulting
in an infinite loop.

If the number of clusters indicated by the file size is inconsistent
with the cluster chain length, exfat_find_last_cluster() will return
an error, so if this inconsistency is found, the traversal can be
aborted without traversing to the EOF cluster.

Reported-by: syzbot+f7d147e6db52b1e09dba@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=f7d147e6db52b1e09dba
Tested-by: syzbot+f7d147e6db52b1e09dba@syzkaller.appspotmail.com
Fixes: 31023864e67a ("exfat: add fat entry operations")
Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/exfat/fatent.c

index 6f3651c6ca91ef8a3f9fa34fece61241e45f6bcc..8df5ad6ebb10cb1357de3d7ea14e512c49fb4861 100644 (file)
@@ -265,7 +265,7 @@ int exfat_find_last_cluster(struct super_block *sb, struct exfat_chain *p_chain,
                clu = next;
                if (exfat_ent_get(sb, clu, &next))
                        return -EIO;
-       } while (next != EXFAT_EOF_CLUSTER);
+       } while (next != EXFAT_EOF_CLUSTER && count <= p_chain->size);
 
        if (p_chain->size != count) {
                exfat_fs_error(sb,