@@ -41,18 +41,45 @@ def __init__(self, config, *args, **kwargs):
4141 help = 'Show orphans (vnodes without a parent)' ,
4242 action = 'store_true' )
4343
44+ @staticmethod
45+ def walk_vnodelist (listhead , loop_vnodes ):
46+ seen = set ()
47+
48+ vnode = listhead .tqh_first .dereference ()
49+ while vnode :
50+ if vnode in seen :
51+ break
52+
53+ loop_vnodes .add (vnode )
54+ vnode = vnode .v_mntvnodes .tqe_next .dereference ()
55+
56+ return loop_vnodes
57+
4458 @staticmethod
4559 def list_files (config ):
4660
4761 plugin = mac_mount .mac_mount (config )
4862 mounts = plugin .calculate ()
4963 vnodes = {}
5064 parent_vnodes = {}
65+ loop_vnodes = set ()
5166
67+ seen = set ()
5268 ## build an initial table of all vnodes
5369 for mount in mounts :
54- vnode = mount .mnt_vnodelist .tqh_first .dereference ()
70+ loop_vnodes = mac_list_files .walk_vnodelist (mount .mnt_vnodelist , loop_vnodes )
71+
72+ loop_vnodes = mac_list_files .walk_vnodelist (mount .mnt_workerqueue , loop_vnodes )
73+
74+ loop_vnodes = mac_list_files .walk_vnodelist (mount .mnt_newvnodes , loop_vnodes )
75+
76+ loop_vnodes .add (mount .mnt_vnodecovered )
5577
78+ loop_vnodes .add (mount .mnt_realrootvp )
79+
80+ loop_vnodes .add (mount .mnt_devvp )
81+
82+ for vnode in loop_vnodes :
5683 while vnode :
5784 ## abort here to prevent going in a loop
5885 if vnode .obj_offset in vnodes :
@@ -66,6 +93,7 @@ def list_files(config):
6693
6794 entry = [name , None , vnode ]
6895 vnodes [vnode .obj_offset ] = entry
96+
6997
7098 else :
7199 name = vnode .v_name .dereference ()
@@ -82,7 +110,7 @@ def list_files(config):
82110
83111 entry = [name , par_offset , vnode ]
84112 vnodes [vnode .obj_offset ] = entry
85-
113+
86114 vnode = vnode .v_mntvnodes .tqe_next .dereference ()
87115
88116 ## account for vnodes that aren't in the list but are
@@ -114,7 +142,7 @@ def list_files(config):
114142 vnodes [parent .obj_offset ] = entry
115143
116144 parent = next_parent
117-
145+
118146 ## build the full paths for all directories
119147 for key , val in vnodes .items ():
120148 name , parent , vnode = val
0 commit comments