diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/ext4_common.c | 10 | ||||
-rw-r--r-- | fs/ext4/ext4fs.c | 10 | ||||
-rw-r--r-- | fs/fat/fat.c | 4 | ||||
-rw-r--r-- | fs/fs_internal.c | 3 | ||||
-rw-r--r-- | fs/yaffs2/yaffs_mtdif.c | 2 |
5 files changed, 25 insertions, 4 deletions
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 31952f48b9..dac9545365 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -660,6 +660,11 @@ static int search_dir(struct ext2_inode *parent_inode, char *dirname) offset = 0; do { + if (offset & 3) { + printf("Badly aligned ext2_dirent\n"); + break; + } + dir = (struct ext2_dirent *)(block_buffer + offset); direntname = (char*)(dir) + sizeof(struct ext2_dirent); @@ -880,6 +885,11 @@ static int unlink_filename(char *filename, unsigned int blknr) offset = 0; do { + if (offset & 3) { + printf("Badly aligned ext2_dirent\n"); + break; + } + previous_dir = dir; dir = (struct ext2_dirent *)(block_buffer + offset); direntname = (char *)(dir) + sizeof(struct ext2_dirent); diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c index b0c7303aa4..9ee2caf2fa 100644 --- a/fs/ext4/ext4fs.c +++ b/fs/ext4/ext4fs.c @@ -64,6 +64,9 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos, char *delayed_buf = NULL; short status; + if (blocksize <= 0) + return -1; + /* Adjust len so it we can't read past the end of the file. */ if (len + pos > filesize) len = (filesize - pos); @@ -127,6 +130,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos, (blockend >> log2blksz); } } else { + int n; if (previous_block_number != -1) { /* spill */ status = ext4fs_devread(delayed_start, @@ -137,7 +141,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos, return -1; previous_block_number = -1; } - memset(buf, 0, blocksize - skipfirst); + /* Zero no more than `len' bytes. */ + n = blocksize - skipfirst; + if (n > len) + n = len; + memset(buf, 0, n); } buf += blocksize - skipfirst; } diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 7fe78439cf..d16883fa10 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -1149,11 +1149,13 @@ typedef struct { int fat_opendir(const char *filename, struct fs_dir_stream **dirsp) { - fat_dir *dir = calloc(1, sizeof(*dir)); + fat_dir *dir; int ret; + dir = malloc_cache_aligned(sizeof(*dir)); if (!dir) return -ENOMEM; + memset(dir, 0, sizeof(*dir)); ret = fat_itr_root(&dir->itr, &dir->fsdata); if (ret) diff --git a/fs/fs_internal.c b/fs/fs_internal.c index 58b441030c..5cdd272c9d 100644 --- a/fs/fs_internal.c +++ b/fs/fs_internal.c @@ -15,12 +15,13 @@ int fs_devread(struct blk_desc *blk, disk_partition_t *partition, lbaint_t sector, int byte_offset, int byte_len, char *buf) { unsigned block_len; - int log2blksz = blk->log2blksz; + int log2blksz; ALLOC_CACHE_ALIGN_BUFFER(char, sec_buf, (blk ? blk->blksz : 0)); if (blk == NULL) { printf("** Invalid Block Device Descriptor (NULL)\n"); return 0; } + log2blksz = blk->log2blksz; /* Check partition boundaries */ if ((sector + ((byte_offset + byte_len - 1) >> log2blksz)) diff --git a/fs/yaffs2/yaffs_mtdif.c b/fs/yaffs2/yaffs_mtdif.c index 636c7770e2..d338f9aa91 100644 --- a/fs/yaffs2/yaffs_mtdif.c +++ b/fs/yaffs2/yaffs_mtdif.c @@ -22,7 +22,7 @@ #include <linux/mtd/mtd.h> #include <linux/types.h> #include <linux/time.h> -#include <linux/mtd/nand.h> +#include <linux/mtd/rawnand.h> static inline void translate_spare2oob(const struct yaffs_spare *spare, u8 *oob) |