From b815a2292cd59de63e5a8c99ffa63159ef4ce5c4 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Wed, 6 Dec 2006 20:36:28 -0800 Subject: [PATCH] --- yaml --- r: 42797 b: refs/heads/master c: e6c4021190c828d7fa24a464db589f86c6708341 h: refs/heads/master i: 42795: b44124c822198e9bd16f354191cd6514f95ee1a7 v: v3 --- [refs] | 2 +- trunk/fs/ext4/dir.c | 3 +++ trunk/fs/ext4/namei.c | 9 +++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 06293fbc02fa..a181950c8acb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 40b851348fe9bf49c26025b34261d25142269b60 +refs/heads/master: e6c4021190c828d7fa24a464db589f86c6708341 diff --git a/trunk/fs/ext4/dir.c b/trunk/fs/ext4/dir.c index f8595787a70e..f2ed3e7fb9f5 100644 --- a/trunk/fs/ext4/dir.c +++ b/trunk/fs/ext4/dir.c @@ -153,6 +153,9 @@ static int ext4_readdir(struct file * filp, ext4_error (sb, "ext4_readdir", "directory #%lu contains a hole at offset %lu", inode->i_ino, (unsigned long)filp->f_pos); + /* corrupt size? Maybe no more blocks to read */ + if (filp->f_pos > inode->i_blocks << 9) + break; filp->f_pos += sb->s_blocksize - offset; continue; } diff --git a/trunk/fs/ext4/namei.c b/trunk/fs/ext4/namei.c index 8b1bd03d20f5..859990eac504 100644 --- a/trunk/fs/ext4/namei.c +++ b/trunk/fs/ext4/namei.c @@ -552,6 +552,15 @@ static int htree_dirblock_to_tree(struct file *dir_file, dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(0)); for (; de < top; de = ext4_next_entry(de)) { + if (!ext4_check_dir_entry("htree_dirblock_to_tree", dir, de, bh, + (block<i_sb)) + +((char *)de - bh->b_data))) { + /* On error, skip the f_pos to the next block. */ + dir_file->f_pos = (dir_file->f_pos | + (dir->i_sb->s_blocksize - 1)) + 1; + brelse (bh); + return count; + } ext4fs_dirhash(de->name, de->name_len, hinfo); if ((hinfo->hash < start_hash) || ((hinfo->hash == start_hash) &&