[U-Boot] [PATCH 1/1] fs: fat: validate sector and cluster size
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Oct 31 20:46:36 UTC 2018
In the rest of the FAT driver we want to be able to rely on the fact that
the cluster size is a power of two. So let's check that both the sector
size and the number of sectors per cluster are valid.
Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
fs/fat/fat.c | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index b08949d3705..0f69fa4df78 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -547,6 +547,39 @@ static int get_fs_info(fsdata *mydata)
return ret;
}
+ /* Validate sector and cluster size */
+ switch (bs.sector_size[1]) {
+ case 2: /* 512 bytes per sector */
+ case 4: /* 1024 bytes per sector */
+ case 8: /* 2048 bytes per sector */
+ case 16: /* 4096 bytes per sector */
+ break;
+ default:
+ ret = -1;
+ }
+ if (ret || bs.sector_size[0]) {
+ debug("FAT: invalid sector size\n");
+ return -1;
+ }
+ switch (bs.cluster_size) {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ case 16:
+ case 32:
+ case 64:
+ case 128:
+ break;
+ default:
+ ret = -1;
+ }
+ /* Check bytes per cluster <= 32768 */
+ if (ret || (u32)bs.sector_size[1] * (u32)bs.cluster_size > 128) {
+ debug("FAT: invalid cluster size\n");
+ return -1;
+ }
+
if (mydata->fatsize == 32) {
mydata->fatlength = bs.fat32_length;
mydata->total_sect = bs.total_sect;
@@ -564,7 +597,7 @@ static int get_fs_info(fsdata *mydata)
mydata->rootdir_sect = mydata->fat_sect + mydata->fatlength * bs.fats;
- mydata->sect_size = (bs.sector_size[1] << 8) + bs.sector_size[0];
+ mydata->sect_size = bs.sector_size[1] << 8;
mydata->clust_size = bs.cluster_size;
if (mydata->sect_size != cur_part_info.blksz) {
printf("Error: FAT sector size mismatch (fs=%hu, dev=%lu)\n",
--
2.19.1
More information about the U-Boot
mailing list