From 6944def0e39a4164992c1a8c05fb283333cf16fe Mon Sep 17 00:00:00 2001 From: isciurus <isciurus@gmail.com> Date: Sun, 8 Sep 2019 17:11:01 -0700 Subject: [PATCH] Calculating xfs_btree_sblock header length correctly for v4/v5 fs --- tsk/fs/tsk_xfs.h | 2 ++ tsk/fs/xfs.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tsk/fs/tsk_xfs.h b/tsk/fs/tsk_xfs.h index ca4ec2474..c2467703d 100644 --- a/tsk/fs/tsk_xfs.h +++ b/tsk/fs/tsk_xfs.h @@ -199,6 +199,8 @@ typedef uint32_t xfs_alloc_ptr_t; typedef struct xfs_btree_sblock xfs_inobt_block_t; +#define XFS_SBLOCK_LEN XFS_INOBT_BLOCK_LEN + typedef struct xfs_inobt_rec { uint32_t ir_startino; uint32_t ir_freecount; diff --git a/tsk/fs/xfs.c b/tsk/fs/xfs.c index c54e6d5f3..7d43793fc 100644 --- a/tsk/fs/xfs.c +++ b/tsk/fs/xfs.c @@ -1223,7 +1223,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr) // take b+tree sorted by block offset cur_sblock_num = agf->agf_roots[0]; if (tsk_verbose) { tsk_fprintf(stderr, "cur_sblock_num = %" PRId64 " \n", cur_sblock_num); } - len = sizeof(xfs_btree_sblock_t); + len = XFS_INOBT_BLOCK_LEN(sb); cnt = tsk_fs_read(&xfs->fs_info, (TSK_OFF_T) sb->sb_blocksize * cur_sblock_num, (char *) cur_btree_sblock, @@ -1258,7 +1258,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr) len = cur_btree_sblock->bb_numrecs * sizeof(xfs_alloc_key_t); cnt = tsk_fs_read(&xfs->fs_info, (TSK_OFF_T) sb->sb_blocksize * (TSK_OFF_T) cur_sblock_num - + (TSK_OFF_T) sizeof(xfs_btree_sblock_t), + + (TSK_OFF_T) XFS_SBLOCK_LEN(sb), (char *) recs, len); if (cnt != len) { @@ -1277,7 +1277,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr) len = cur_btree_sblock->bb_numrecs * sizeof(xfs_alloc_ptr_t); cnt = tsk_fs_read(&xfs->fs_info, (TSK_OFF_T) sb->sb_blocksize * (TSK_OFF_T) cur_sblock_num - + (TSK_OFF_T) sizeof(xfs_btree_sblock_t) + + (TSK_OFF_T) XFS_SBLOCK_LEN(sb) + (TSK_OFF_T) (cur_btree_sblock->bb_numrecs * sizeof(xfs_alloc_key_t)), (char *) ptrs, len); @@ -1352,7 +1352,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr) // read all the records len = cur_btree_sblock->bb_numrecs * sizeof(xfs_alloc_rec_t); cnt = tsk_fs_read(&xfs->fs_info, - (TSK_OFF_T) sb->sb_blocksize * cur_sblock_num + sizeof(xfs_btree_sblock_t), + (TSK_OFF_T) sb->sb_blocksize * cur_sblock_num + XFS_SBLOCK_LEN(sb), (char *) recs, len); if (cnt != len) { -- GitLab