diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index ca5499e9412b..04d2328ee1d4 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -1708,7 +1708,8 @@ static int ext4_ext_correct_indexes(handle_t *handle, struct inode *inode, struct ext4_extent *ex; __le32 border; int k, err = 0; - + if (!path || depth < 0 || depth > EXT4_MAX_EXTENT_DEPTH) + return -EFSCORRUPTED; eh = path[depth].p_hdr; ex = path[depth].p_ext; @@ -4200,19 +4201,26 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, unsigned int allocated_clusters = 0; struct ext4_allocation_request ar; ext4_lblk_t cluster_offset; + struct ext4_extent_header *eh; ext_debug(inode, "blocks %u/%u requested\n", map->m_lblk, map->m_len); trace_ext4_ext_map_blocks_enter(inode, map->m_lblk, map->m_len, flags); - + depth = ext_depth(inode); + if (depth == 0) + eh = ext_inode_hdr(inode); + else + eh = path[depth].p_hdr; + if (!eh || le16_to_cpu(eh->eh_magic) != EXT4_EXT_MAGIC) { + EXT4_ERROR_INODE(inode, "invalid extent header at depth %d", depth); + err = -EFSCORRUPTED; + goto out; + } /* find extent for this block */ path = ext4_find_extent(inode, map->m_lblk, NULL, flags); if (IS_ERR(path)) { err = PTR_ERR(path); goto out; } - - depth = ext_depth(inode); - /* * consistent leaf must not be empty; * this situation is possible, though, _during_ tree modification;