mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-22 07:53:11 -05:00
exfat: fix the infinite loop in __exfat_free_cluster()
In __exfat_free_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.
This commit uses the total number of clusters to prevent this infinite
loop.
Reported-by: syzbot+1de5a37cb85a2d536330@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=1de5a37cb85a2d536330
Tested-by: syzbot+1de5a37cb85a2d536330@syzkaller.appspotmail.com
Fixes: 31023864e6
("exfat: add fat entry operations")
Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
parent
98e2fb26d1
commit
a5324b3a48
1 changed files with 10 additions and 0 deletions
|
@ -216,6 +216,16 @@ static int __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain
|
|||
|
||||
if (err)
|
||||
goto dec_used_clus;
|
||||
|
||||
if (num_clusters >= sbi->num_clusters - EXFAT_FIRST_CLUSTER) {
|
||||
/*
|
||||
* The cluster chain includes a loop, scan the
|
||||
* bitmap to get the number of used clusters.
|
||||
*/
|
||||
exfat_count_used_clusters(sb, &sbi->used_clusters);
|
||||
|
||||
return 0;
|
||||
}
|
||||
} while (clu != EXFAT_EOF_CLUSTER);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue