mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:09:29 +02:00
exfat: fix overflow in cluster-to-dentry conversion
The cluster-to-dentry calculation is performed as u32 and may overflow and wrap around on large volumes. This can result in an incorrect max_dentries value, causing readdir to stop early and omit directory entries. Cast nr_clusters to u64 before shifting to avoid the overflow. Signed-off-by: Yang Wen <anmuxixixi@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
+1
-1
@@ -87,7 +87,7 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent
|
||||
exfat_bytes_to_cluster(sbi, i_size_read(inode)), ei->flags);
|
||||
|
||||
dentries_per_clu = sbi->dentries_per_clu;
|
||||
max_dentries = min(MAX_EXFAT_DENTRIES,
|
||||
max_dentries = (unsigned int)min_t(u64, MAX_EXFAT_DENTRIES,
|
||||
exfat_cluster_to_dentries(sbi, sbi->num_clusters));
|
||||
|
||||
clu_offset = exfat_dentries_to_cluster(sbi, dentry);
|
||||
|
||||
+2
-2
@@ -487,10 +487,10 @@ static inline u32 exfat_dentries_to_bytes(u32 dentry)
|
||||
/*
|
||||
* helpers for cluster size to dentry size conversion.
|
||||
*/
|
||||
static inline u32 exfat_cluster_to_dentries(struct exfat_sb_info *sbi,
|
||||
static inline u64 exfat_cluster_to_dentries(struct exfat_sb_info *sbi,
|
||||
u32 nr_clusters)
|
||||
{
|
||||
return nr_clusters << (sbi->cluster_size_bits - DENTRY_SIZE_BITS);
|
||||
return (u64)nr_clusters << (sbi->cluster_size_bits - DENTRY_SIZE_BITS);
|
||||
}
|
||||
|
||||
static inline u32 exfat_dentries_to_cluster(struct exfat_sb_info *sbi,
|
||||
|
||||
Reference in New Issue
Block a user