diff options
| -rw-r--r-- | fs/ext4/dir.c | 3 | ||||
| -rw-r--r-- | fs/ext4/namei.c | 9 |
2 files changed, 12 insertions, 0 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index f8595787a70e..f2ed3e7fb9f5 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
| @@ -153,6 +153,9 @@ static int ext4_readdir(struct file * filp, | |||
| 153 | ext4_error (sb, "ext4_readdir", | 153 | ext4_error (sb, "ext4_readdir", |
| 154 | "directory #%lu contains a hole at offset %lu", | 154 | "directory #%lu contains a hole at offset %lu", |
| 155 | inode->i_ino, (unsigned long)filp->f_pos); | 155 | inode->i_ino, (unsigned long)filp->f_pos); |
| 156 | /* corrupt size? Maybe no more blocks to read */ | ||
| 157 | if (filp->f_pos > inode->i_blocks << 9) | ||
| 158 | break; | ||
| 156 | filp->f_pos += sb->s_blocksize - offset; | 159 | filp->f_pos += sb->s_blocksize - offset; |
| 157 | continue; | 160 | continue; |
| 158 | } | 161 | } |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 8b1bd03d20f5..859990eac504 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -552,6 +552,15 @@ static int htree_dirblock_to_tree(struct file *dir_file, | |||
| 552 | dir->i_sb->s_blocksize - | 552 | dir->i_sb->s_blocksize - |
| 553 | EXT4_DIR_REC_LEN(0)); | 553 | EXT4_DIR_REC_LEN(0)); |
| 554 | for (; de < top; de = ext4_next_entry(de)) { | 554 | for (; de < top; de = ext4_next_entry(de)) { |
| 555 | if (!ext4_check_dir_entry("htree_dirblock_to_tree", dir, de, bh, | ||
| 556 | (block<<EXT4_BLOCK_SIZE_BITS(dir->i_sb)) | ||
| 557 | +((char *)de - bh->b_data))) { | ||
| 558 | /* On error, skip the f_pos to the next block. */ | ||
| 559 | dir_file->f_pos = (dir_file->f_pos | | ||
| 560 | (dir->i_sb->s_blocksize - 1)) + 1; | ||
| 561 | brelse (bh); | ||
| 562 | return count; | ||
| 563 | } | ||
| 555 | ext4fs_dirhash(de->name, de->name_len, hinfo); | 564 | ext4fs_dirhash(de->name, de->name_len, hinfo); |
| 556 | if ((hinfo->hash < start_hash) || | 565 | if ((hinfo->hash < start_hash) || |
| 557 | ((hinfo->hash == start_hash) && | 566 | ((hinfo->hash == start_hash) && |
