diff --git a/ext4/extent.py b/ext4/extent.py index 13929ea..579bec4 100644 --- a/ext4/extent.py +++ b/ext4/extent.py @@ -2,8 +2,8 @@ from ctypes import c_uint16 from ctypes import sizeof -from .struct import Ext4Struct from .struct import crc32c +from .struct import Ext4Struct class ExtentBlocks(object): diff --git a/ext4/inode.py b/ext4/inode.py index d07e056..5ddad97 100644 --- a/ext4/inode.py +++ b/ext4/inode.py @@ -11,8 +11,8 @@ from ._compat import override -from .struct import Ext4Struct from .struct import crc32c +from .struct import Ext4Struct from .struct import MagicError from .enum import EXT4_OS @@ -189,6 +189,16 @@ def __init__(self, volume, offset, i_no): super().__init__(volume, offset) self.tree = ExtentTree(self) + @property + def extra_inode_data(self) -> bytes: + if not self.has_hi: + return b"" + + size = sizeof(self) + assert size == self.EXT2_GOOD_OLD_INODE_SIZE + self.i_extra_isize + _ = self.volume.seek(self.offset + size) + return self.volume.read(self.superblock.s_inode_size - size) + @property def superblock(self): return self.volume.superblock @@ -248,7 +258,12 @@ def checksum(self): csum = crc32c(b"\0" * Inode.i_checksum_hi.size, csum) offset += Inode.i_checksum_hi.size - csum = crc32c(data[offset:], csum) + csum = crc32c( + data[offset:], + csum, + ) + if self.superblock.s_inode_size - len(data) > 0: + csum = crc32c(self.extra_inode_data, csum) if not self.has_hi: csum &= 0xFFFF diff --git a/ext4/xattr.py b/ext4/xattr.py index 154de7a..c092d9b 100644 --- a/ext4/xattr.py +++ b/ext4/xattr.py @@ -5,12 +5,14 @@ from ctypes import c_uint8 from ctypes import sizeof -from .struct import Ext4Struct -from .struct import crc32c -from .enum import EXT4_FL -from .enum import EXT4_FEATURE_INCOMPAT from ._compat import override +from .enum import EXT4_FEATURE_INCOMPAT +from .enum import EXT4_FL + +from .struct import crc32c +from .struct import Ext4Struct + class ExtendedAttributeError(Exception): pass diff --git a/pyproject.toml b/pyproject.toml index d42c885..b22d631 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ext4" -version = "1.2.1" +version = "1.2.2" authors = [ { name="Eeems", email="eeems@eeems.email" }, ] diff --git a/test.py b/test.py index 4377f23..b68cf6b 100644 --- a/test.py +++ b/test.py @@ -65,6 +65,18 @@ def _assert(source: str): # Extract specific file volume = ext4.Volume(f, offset=offset) + + try: + print("Validate root inode: ", end="") + volume.root.validate() + print("pass") + + except ext4.struct.ChecksumError as e: + FAILED = True + print("fail") + print(" ", end="") + print(e) + inode = cast(ext4.File, volume.inode_at("/test.txt")) _assert("isinstance(inode, ext4.File)") b = inode.open()