diff options
author | michael | 2008-03-02 23:33:46 +0100 |
---|---|---|
committer | Wolfgang Denk | 2008-03-03 00:40:42 +0100 |
commit | 8ce4e5c2c02cb7e8adddf7b651d3050d81ce4c1d (patch) | |
tree | 8941f5d852a1e857e4e953a58fd475624a1e401b | |
parent | 661bad63a076a96c39c64f136915f146725af92b (diff) |
Fix checking fat32 cluster size.
This fixes the cluster size tests in the FAT32 file system.
The current implementation of VFAT support doesn't work if the
referred cluster has an offset > 16bit representation, causing
"fatload" and "fatls" commands etc. to fail.
Signed-off-by: michael trimarchi <trimarchi@gandalf.sssup.it>
-rw-r--r-- | fs/fat/fat.c | 8 | ||||
-rw-r--r-- | include/fat.h | 3 |
2 files changed, 6 insertions, 5 deletions
diff --git a/fs/fat/fat.c b/fs/fat/fat.c index c1e57412d77..49c78ed79ac 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -352,7 +352,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer, newclust = get_fatent(mydata, endclust); if((newclust -1)!=endclust) goto getit; - if (newclust <= 0x0001 || newclust >= 0xfff0) { + if (CHECK_CLUST(newclust, mydata->fatsize)) { FAT_DPRINT("curclust: 0x%x\n", newclust); FAT_DPRINT("Invalid FAT entry\n"); return gotsize; @@ -387,7 +387,7 @@ getit: filesize -= actsize; buffer += actsize; curclust = get_fatent(mydata, endclust); - if (curclust <= 0x0001 || curclust >= 0xfff0) { + if (CHECK_CLUST(curclust, mydata->fatsize)) { FAT_DPRINT("curclust: 0x%x\n", curclust); FAT_ERROR("Invalid FAT entry\n"); return gotsize; @@ -459,7 +459,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, slotptr--; curclust = get_fatent(mydata, curclust); - if (curclust <= 0x0001 || curclust >= 0xfff0) { + if (CHECK_CLUST(curclust, mydata->fatsize)) { FAT_DPRINT("curclust: 0x%x\n", curclust); FAT_ERROR("Invalid FAT entry\n"); return -1; @@ -652,7 +652,7 @@ static dir_entry *get_dentfromdir (fsdata * mydata, int startsect, return retdent; } curclust = get_fatent (mydata, curclust); - if (curclust <= 0x0001 || curclust >= 0xfff0) { + if (CHECK_CLUST(curclust, mydata->fatsize)) { FAT_DPRINT ("curclust: 0x%x\n", curclust); FAT_ERROR ("Invalid FAT entry\n"); return NULL; diff --git a/include/fat.h b/include/fat.h index 92638d535e4..f993ccab1c2 100644 --- a/include/fat.h +++ b/include/fat.h @@ -111,7 +111,8 @@ #define START(dent) (FAT2CPU16((dent)->start) \ + (mydata->fatsize != 32 ? 0 : \ (FAT2CPU16((dent)->starthi) << 16))) - +#define CHECK_CLUST(x, fatsize) ((x) <= 1 || \ + (x) >= ((fatsize) != 32 ? 0xfff0 : 0xffffff0)) typedef struct boot_sector { __u8 ignored[3]; /* Bootstrap code */ |