diff --git a/tsk/fs/ext2fs.c b/tsk/fs/ext2fs.c index a7fe539590a72cdeed96b6be8193aadbea7eddcc..adb06e9ba453772d510e5039433cc55db28c314c 100755 --- a/tsk/fs/ext2fs.c +++ b/tsk/fs/ext2fs.c @@ -1613,7 +1613,7 @@ ext2fs_make_data_run_extent(TSK_FS_INFO * fs_info, TSK_FS_ATTR * fs_attr, static TSK_OFF_T ext2fs_make_data_run_extent_index(TSK_FS_INFO * fs_info, TSK_FS_ATTR * fs_attr, TSK_FS_ATTR * fs_attr_extent, - TSK_DADDR_T idx_block) + TSK_DADDR_T idx_block, TSK_DADDR_T * idx_offset) { ext2fs_extent_header *header; TSK_FS_ATTR_RUN *data_run; @@ -1655,8 +1655,10 @@ ext2fs_make_data_run_extent_index(TSK_FS_INFO * fs_info, free(buf); return 1; } + data_run->offset = *idx_offset; + ++*idx_offset; data_run->addr = idx_block; - data_run->len = fs_blocksize; + data_run->len = 1; if (tsk_fs_attr_add_run(fs_info, fs_attr_extent, data_run)) { tsk_fs_attr_run_free(data_run); @@ -1701,7 +1703,7 @@ ext2fs_make_data_run_extent_index(TSK_FS_INFO * fs_info, index->ei_leaf_hi)) << 16) | tsk_getu32(fs_info-> endian, index->ei_leaf_lo); if (ext2fs_make_data_run_extent_index(fs_info, fs_attr, - fs_attr_extent, child_block)) { + fs_attr_extent, child_block, idx_offset)) { free(buf); return 1; } @@ -1934,6 +1936,7 @@ ext4_load_attrs_extents(TSK_FS_FILE *fs_file) else { /* interior node */ TSK_FS_ATTR *fs_attr_extent; int32_t extent_index_size; + TSK_DADDR_T idx_offset; // Ensure fs_meta->content_ptr is sufficiently large // Otherwise indices[i] below can cause an OOB read @@ -1965,6 +1968,7 @@ ext4_load_attrs_extents(TSK_FS_FILE *fs_file) } indices = (ext2fs_extent_idx *) (header + 1); + idx_offset = 0; for (i = 0; i < num_entries; i++) { ext2fs_extent_idx *index = &indices[i]; TSK_DADDR_T child_block = @@ -1973,7 +1977,7 @@ ext4_load_attrs_extents(TSK_FS_FILE *fs_file) ei_leaf_hi)) << 16) | tsk_getu32(fs_info-> endian, index->ei_leaf_lo); if (ext2fs_make_data_run_extent_index(fs_info, fs_attr, - fs_attr_extent, child_block)) { + fs_attr_extent, child_block, &idx_offset)) { return 1; } }