diff --git a/source/ff.c b/source/ff.c index 20b5795..f1e7a9c 100644 --- a/source/ff.c +++ b/source/ff.c @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------/ -/ FatFs - Generic FAT Filesystem Module R0.16 w/patch 1 / +/ FatFs - Generic FAT Filesystem Module R0.16 w/patch 2 / /-----------------------------------------------------------------------------/ / / Copyright (C) 2025, ChaN, all right reserved. @@ -41,6 +41,7 @@ #define MAX_FAT16 0xFFF5 /* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */ #define MAX_FAT32 0x0FFFFFF5 /* Max FAT32 clusters (not defined in specs, practical limit) */ #define MAX_EXFAT 0x7FFFFFFD /* Max exFAT clusters (differs from specs, implementation limit) */ +#define MIN_EXFAT 0x00000100 /* Min exFAT clusters (Not defined in specs, implementation limit) */ #define MIN_FAT12 32 /* Min FAT12 clusters (Not defined in specs, implementation limit) */ #define MIN_VOLUME 64 /* Min volume sectors (Not defined in specs, implementation limit) */ @@ -3547,7 +3548,7 @@ static FRESULT mount_volume ( /* FR_OK(0): successful, !=0: an error occurred */ if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768 sectors) */ ncl = ld_32(fs->win + BPB_NumClusEx); /* Number of clusters */ - if (ncl > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Too many clusters) */ + if (ncl < MIN_EXFAT || ncl > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Wrong cluster count) */ fs->n_fatent = ncl + 2; /* Boundaries and Limits */ @@ -3592,6 +3593,7 @@ static FRESULT mount_volume ( /* FR_OK(0): successful, !=0: an error occurred */ fasize = ld_16(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ if (fasize == 0) fasize = ld_32(fs->win + BPB_FATSz32); + if (fasize >= 0x200000) return FR_NO_FILESYSTEM; /* (Must be smaller than max FAT size) */ fs->fsize = fasize; fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ @@ -5529,7 +5531,7 @@ FRESULT f_getlabel ( WCHAR hs; UINT nw; - for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel] && si < 11; si++) { /* Extract volume label from 83 entry */ wc = ld_16(dj.dir + XDIR_Label + si * 2); if (hs == 0 && IsSurrogate(wc)) { /* Is the code a surrogate? */ hs = wc; continue;