]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fs: check FAT cluster size
authorPatrick Wildt <patrick@blueri.se>
Mon, 26 Nov 2018 14:56:57 +0000 (15:56 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 7 Dec 2018 04:26:31 +0000 (23:26 -0500)
The cluster size specifies how many sectors make up a cluster.  A
cluster size of zero makes no sense, as it would mean that the
cluster is made up of no sectors.  This will later lead into a
division by zero in sect_to_clust(), so better take care of that
early.

The MAX_CLUSTSIZE define can reduced using a define to make some
room in low-memory system.  Unfortunately if the code reads a
filesystem with a bigger cluster size it will overflow the buffer.

Signed-off-by: Patrick Wildt <patrick@blueri.se>
fs/fat/fat.c

index 4bc3030ab88fb993a33bbd22632836ff8de8d300..e0c076763f57add116f93ef173317c27cda44fca 100644 (file)
@@ -571,6 +571,17 @@ static int get_fs_info(fsdata *mydata)
                                mydata->sect_size, cur_part_info.blksz);
                return -1;
        }
+       if (mydata->clust_size == 0) {
+               printf("Error: FAT cluster size not set\n");
+               return -1;
+       }
+       if ((unsigned int)mydata->clust_size * mydata->sect_size >
+           MAX_CLUSTSIZE) {
+               printf("Error: FAT cluster size too big (cs=%u, max=%u)\n",
+                      (unsigned int)mydata->clust_size * mydata->sect_size,
+                      MAX_CLUSTSIZE);
+               return -1;
+       }
 
        if (mydata->fatsize == 32) {
                mydata->data_begin = mydata->rootdir_sect -