From ce1120dd703e6f12c59e4eba9962356a0300b832 Mon Sep 17 00:00:00 2001 From: Dave Liu Date: Fri, 29 Feb 2008 17:45:31 +0800 Subject: fs: Fix ext2 read issue The ext2 aligned process will corrupt the key data struct, the patch fix this. Signed-off-by: Dave Liu --- fs/ext2/dev.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'fs') diff --git a/fs/ext2/dev.c b/fs/ext2/dev.c index 643a1a8c85..1728b34fc8 100644 --- a/fs/ext2/dev.c +++ b/fs/ext2/dev.c @@ -96,8 +96,23 @@ int ext2fs_devread (int sector, int byte_offset, int byte_len, char *buf) { sector++; } + if (byte_len == 0) + return 1; + /* read sector aligned part */ block_len = byte_len & ~(SECTOR_SIZE - 1); + + if (block_len == 0) { + u8 p[SECTOR_SIZE]; + + block_len = SECTOR_SIZE; + ext2fs_block_dev_desc->block_read(ext2fs_block_dev_desc->dev, + part_info.start + sector, + 1, (unsigned long *)p); + memcpy(buf, p, byte_len); + return 1; + } + if (ext2fs_block_dev_desc->block_read (ext2fs_block_dev_desc->dev, part_info.start + sector, block_len / SECTOR_SIZE, @@ -106,6 +121,7 @@ int ext2fs_devread (int sector, int byte_offset, int byte_len, char *buf) { printf (" ** ext2fs_devread() read error - block\n"); return (0); } + block_len = byte_len & ~(SECTOR_SIZE - 1); buf += block_len; byte_len -= block_len; sector += block_len / SECTOR_SIZE; -- cgit v1.2.3 From 8ce4e5c2c02cb7e8adddf7b651d3050d81ce4c1d Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 2 Mar 2008 23:33:46 +0100 Subject: 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 --- fs/fat/fat.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'fs') diff --git a/fs/fat/fat.c b/fs/fat/fat.c index c1e57412d7..49c78ed79a 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; -- cgit v1.2.3