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