From f75849857ebe185ef8e7cb30f4cf88d1dc5d2067 Mon Sep 17 00:00:00 2001
From: isciurus <isciurus@gmail.com>
Date: Mon, 6 May 2019 07:36:05 -0700
Subject: [PATCH] Using nextents to determine the format of a directory inode
 instead of inode size

---
 tsk/fs/xfs.cpp | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/tsk/fs/xfs.cpp b/tsk/fs/xfs.cpp
index fda17a834..e6cae7048 100644
--- a/tsk/fs/xfs.cpp
+++ b/tsk/fs/xfs.cpp
@@ -2622,8 +2622,17 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
 
         if (tsk_verbose) { tsk_fprintf(stderr, "nextents == %" PRId64 ", fs_meta->size = %" PRId64 " \n", nextents, fs_meta->size); }
 
-        if (fs_meta->size <= xfs->fs_info.block_size /* nextents can be used too */)
+        if (nextents == 0)
         {
+            tsk_error_reset();
+            tsk_error_set_errno(TSK_ERR_FS_ARG);
+            tsk_error_set_errstr
+                ("xfs_dir_open_meta: fs_meta->nextents is 0 for TSK_FS_META_CONTENT_TYPE_XFS_EXTENTS type");
+            return TSK_ERR;
+        } else if (nextents == 1)
+        {
+            // parsing "block directory" format
+
             // unpack extent
             xfs_bmbt_irec_t irec;
             memset(&irec, 0, sizeof(irec));
@@ -2816,6 +2825,8 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
         }
         else
         {
+            // parsing "leaf direcory" and "node directory" formats
+
             for(uint32_t extent_num = 0; extent_num < nextents; extent_num++)
             {
                 // unpack extent
-- 
GitLab