diff options
-rw-r--r-- | fs/ext2/dir.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index b3dbd716cd3a..8a27dcc096b5 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c @@ -369,6 +369,14 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir, } if (++n >= npages) n = 0; + /* next page is past the blocks we've got */ + if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) { + ext2_error(dir->i_sb, __FUNCTION__, + "dir %lu size %lld exceeds block count %llu", + dir->i_ino, dir->i_size, + (unsigned long long)dir->i_blocks); + goto out; + } } while (n != start); out: return NULL; |