浏览代码

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>
michael 17 年之前
父节点
当前提交
8ce4e5c2c0
共有 2 个文件被更改,包括 6 次插入5 次删除
  1. 4 4
      fs/fat/fat.c
  2. 2 1
      include/fat.h

+ 4 - 4
fs/fat/fat.c

@@ -352,7 +352,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
 			newclust = get_fatent(mydata, endclust);
 			newclust = get_fatent(mydata, endclust);
 			if((newclust -1)!=endclust)
 			if((newclust -1)!=endclust)
 				goto getit;
 				goto getit;
-			if (newclust <= 0x0001 || newclust >= 0xfff0) {
+			if (CHECK_CLUST(newclust, mydata->fatsize)) {
 				FAT_DPRINT("curclust: 0x%x\n", newclust);
 				FAT_DPRINT("curclust: 0x%x\n", newclust);
 				FAT_DPRINT("Invalid FAT entry\n");
 				FAT_DPRINT("Invalid FAT entry\n");
 				return gotsize;
 				return gotsize;
@@ -387,7 +387,7 @@ getit:
 		filesize -= actsize;
 		filesize -= actsize;
 		buffer += actsize;
 		buffer += actsize;
 		curclust = get_fatent(mydata, endclust);
 		curclust = get_fatent(mydata, endclust);
-		if (curclust <= 0x0001 || curclust >= 0xfff0) {
+		if (CHECK_CLUST(curclust, mydata->fatsize)) {
 			FAT_DPRINT("curclust: 0x%x\n", curclust);
 			FAT_DPRINT("curclust: 0x%x\n", curclust);
 			FAT_ERROR("Invalid FAT entry\n");
 			FAT_ERROR("Invalid FAT entry\n");
 			return gotsize;
 			return gotsize;
@@ -459,7 +459,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
 
 
 		slotptr--;
 		slotptr--;
 		curclust = get_fatent(mydata, curclust);
 		curclust = get_fatent(mydata, curclust);
-		if (curclust <= 0x0001 || curclust >= 0xfff0) {
+		if (CHECK_CLUST(curclust, mydata->fatsize)) {
 			FAT_DPRINT("curclust: 0x%x\n", curclust);
 			FAT_DPRINT("curclust: 0x%x\n", curclust);
 			FAT_ERROR("Invalid FAT entry\n");
 			FAT_ERROR("Invalid FAT entry\n");
 			return -1;
 			return -1;
@@ -652,7 +652,7 @@ static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,
 	    return retdent;
 	    return retdent;
 	}
 	}
 	curclust = get_fatent (mydata, curclust);
 	curclust = get_fatent (mydata, curclust);
-	if (curclust <= 0x0001 || curclust >= 0xfff0) {
+	if (CHECK_CLUST(curclust, mydata->fatsize)) {
 	    FAT_DPRINT ("curclust: 0x%x\n", curclust);
 	    FAT_DPRINT ("curclust: 0x%x\n", curclust);
 	    FAT_ERROR ("Invalid FAT entry\n");
 	    FAT_ERROR ("Invalid FAT entry\n");
 	    return NULL;
 	    return NULL;

+ 2 - 1
include/fat.h

@@ -111,7 +111,8 @@
 #define START(dent)	(FAT2CPU16((dent)->start) \
 #define START(dent)	(FAT2CPU16((dent)->start) \
 			+ (mydata->fatsize != 32 ? 0 : \
 			+ (mydata->fatsize != 32 ? 0 : \
 			  (FAT2CPU16((dent)->starthi) << 16)))
 			  (FAT2CPU16((dent)->starthi) << 16)))
-
+#define CHECK_CLUST(x, fatsize) ((x) <= 1 || \
+				(x) >= ((fatsize) != 32 ? 0xfff0 : 0xffffff0))
 
 
 typedef struct boot_sector {
 typedef struct boot_sector {
 	__u8	ignored[3];	/* Bootstrap code */
 	__u8	ignored[3];	/* Bootstrap code */