fat: fix FAT sector offsets overflow on large FAT partitions
authorAaron Williams <aaron.williams@caviumnetworks.com>
Sat, 19 May 2012 07:20:40 +0000 (07:20 +0000)
committerWolfgang Denk <wd@denx.de>
Tue, 22 May 2012 08:14:05 +0000 (10:14 +0200)
This patch fixes several issues where sector offsets can overflow due
to being limited to 16-bits. The cases where an overflow can happen
when accessing large FAT32 partitions are:

 - length of FAT in sectors
 - start sector of root directory
 - the sector of the first cluster

These issues were observed when reading files from a 64GB FAT32
filesystem.

Signed-off-by: Aaron Williams <aaron.williams@caviumnetworks.com>
Tested-by: Anatolij Gustschin <agust@denx.de>
Signed-off-by: Anatolij Gustschin <agust@denx.de>
include/fat.h

index 4c92442fd34d3b9d20e5384674531c15b4b51243..f1b4a0d97c3be48af96c00eb9720ee10c251afd2 100644 (file)
@@ -178,12 +178,12 @@ typedef struct dir_slot {
 typedef struct {
        __u8    *fatbuf;        /* Current FAT buffer */
        int     fatsize;        /* Size of FAT in bits */
-       __u16   fatlength;      /* Length of FAT in sectors */
+       __u32   fatlength;      /* Length of FAT in sectors */
        __u16   fat_sect;       /* Starting sector of the FAT */
-       __u16   rootdir_sect;   /* Start sector of root directory */
+       __u32   rootdir_sect;   /* Start sector of root directory */
        __u16   sect_size;      /* Size of sectors in bytes */
        __u16   clust_size;     /* Size of clusters in sectors */
-       short   data_begin;     /* The sector of the first cluster, can be negative */
+       int     data_begin;     /* The sector of the first cluster, can be negative */
        int     fatbufnum;      /* Used by get_fatent, init to -1 */
 } fsdata;