@@ -638,11 +638,23 @@ def get_flags_opts(self) -> Iterable[str]:
638638 ]
639639 return sb_opts
640640
641- def get_type (self ):
642- mnt_sb_type = utility .pointer_to_string (self .s_type .name , count = 255 )
643- if self .s_subtype :
644- mnt_sb_subtype = utility .pointer_to_string (self .s_subtype , count = 255 )
641+ def get_type (self ) -> Optional [str ]:
642+ """Gets the superblock filesystem type string"""
643+
644+ s_type_ptr = self .s_type
645+ if not (s_type_ptr and s_type_ptr .is_readable ()):
646+ return None
647+
648+ s_type_name_ptr = s_type_ptr .name
649+ if not (s_type_name_ptr and s_type_name_ptr .is_readable ()):
650+ return None
651+
652+ mnt_sb_type = utility .pointer_to_string (s_type_name_ptr , count = 255 )
653+ s_subtype_ptr = self .s_subtype
654+ if s_subtype_ptr and s_subtype_ptr .is_readable ():
655+ mnt_sb_subtype = utility .pointer_to_string (s_subtype_ptr , count = 255 )
645656 mnt_sb_type += "." + mnt_sb_subtype
657+
646658 return mnt_sb_type
647659
648660
@@ -843,25 +855,55 @@ def get_subdirs(self) -> interfaces.objects.ObjectInterface:
843855 dentry_type_name = self .get_symbol_table_name () + constants .BANG + "dentry"
844856 yield from list_head_member .to_list (dentry_type_name , walk_member )
845857
858+ def get_inode (self ) -> interfaces .objects .ObjectInterface :
859+ """Returns the inode associated with this dentry"""
860+
861+ inode_ptr = self .d_inode
862+ if not (inode_ptr and inode_ptr .is_readable () and inode_ptr .is_valid ()):
863+ return None
864+
865+ return inode_ptr .dereference ()
866+
846867
847868class struct_file (objects .StructType ):
848869 def get_dentry (self ) -> interfaces .objects .ObjectInterface :
849- if self .has_member ("f_dentry" ):
850- return self .f_dentry
851- elif self .has_member ("f_path" ):
870+ """Returns a pointer to the dentry associated with this file"""
871+ if self .has_member ("f_path" ):
852872 return self .f_path .dentry
873+ elif self .has_member ("f_dentry" ):
874+ return self .f_dentry
853875 else :
854876 raise AttributeError ("Unable to find file -> dentry" )
855877
856878 def get_vfsmnt (self ) -> interfaces .objects .ObjectInterface :
857879 """Returns the fs (vfsmount) where this file is mounted"""
858- if self .has_member ("f_vfsmnt" ):
859- return self .f_vfsmnt
860- elif self .has_member ("f_path" ):
880+ if self .has_member ("f_path" ):
861881 return self .f_path .mnt
882+ elif self .has_member ("f_vfsmnt" ):
883+ return self .f_vfsmnt
862884 else :
863885 raise AttributeError ("Unable to find file -> vfs mount" )
864886
887+ def get_inode (self ) -> interfaces .objects .ObjectInterface :
888+ """Returns an inode associated with this file"""
889+
890+ inode_ptr = None
891+ if self .has_member ("f_inode" ) and self .f_inode and self .f_inode .is_readable ():
892+ # Try first the cached value, kernels +3.9
893+ inode_ptr = self .f_inode
894+
895+ if not (inode_ptr and inode_ptr .is_readable () and inode_ptr .is_valid ()):
896+ dentry_ptr = self .get_dentry ()
897+ if not (dentry_ptr and dentry_ptr .is_readable ()):
898+ return None
899+
900+ inode_ptr = dentry_ptr .d_inode
901+
902+ if not (inode_ptr and inode_ptr .is_readable () and inode_ptr .is_valid ()):
903+ return None
904+
905+ return inode_ptr .dereference ()
906+
865907
866908class list_head (objects .StructType , collections .abc .Iterable ):
867909 def to_list (
0 commit comments