summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael <trimarchi@gandalf.sssup.it>2008-03-02 23:33:46 +0100
committerWolfgang Denk <wd@denx.de>2008-03-03 00:40:42 +0100
commit8ce4e5c2c02cb7e8adddf7b651d3050d81ce4c1d (patch)
tree8941f5d852a1e857e4e953a58fd475624a1e401b
parent661bad63a076a96c39c64f136915f146725af92b (diff)
downloadu-boot-imx-8ce4e5c2c02cb7e8adddf7b651d3050d81ce4c1d.zip
u-boot-imx-8ce4e5c2c02cb7e8adddf7b651d3050d81ce4c1d.tar.gz
u-boot-imx-8ce4e5c2c02cb7e8adddf7b651d3050d81ce4c1d.tar.bz2
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.c8
-rw-r--r--include/fat.h3
2 files changed, 6 insertions, 5 deletions
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index c1e5741..49c78ed 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 92638d5..f993cca 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 */