From 63bf8e4acdbcbfc03e5023291c9ee137f858969f Mon Sep 17 00:00:00 2001 From: Stefan Ott Date: Sat, 4 Apr 2020 01:34:33 +0200 Subject: Consider sector size when checking cluster size On file systems with 2048 bytes per cluster, the bpb_secperclus value gets multiplied by 4 when the meta data is loaded. This patch changes the sanity check to consider (and reverse) that multiplication before checking the cluster size. Signed-off-by: Stefan Ott --- firmware/drivers/fat.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index fed3baffd4..b14e461a65 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c @@ -391,7 +391,12 @@ static int bpb_is_sane(struct bpb *fat_bpb) return -1; } - if (fat_bpb->bpb_secperclus * fat_bpb->bpb_bytspersec > 128*1024ul) + /* The fat_bpb struct does not hold the raw value of bpb_bytspersec, the + * value is multiplied in cases where bpb_bytspersec != SECTOR_SIZE. We need + * to undo that multiplication before we do the sanity check. */ + unsigned long secmult = fat_bpb->bpb_bytspersec / SECTOR_SIZE; + + if (fat_bpb->bpb_secperclus * fat_bpb->bpb_bytspersec / secmult > 128*1024ul) { DEBUGF("%s() - Error: cluster size is larger than 128K " "(%lu * %lu = %lu)\n", __func__, -- cgit v1.2.3