From 17791181afa427a024534ab8b5a6cbab7509dca6 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sun, 4 Feb 2024 11:10:11 +0900 Subject: [PATCH] ext2: add support to various inode sizes the script used for generating test inputs: declare -A sizes=( [1024,1024]=$((130048 + 1024)) [2048,512]=$(( 45056 + 2048)) [4096,128]=$(( 53248 + 4096)) ) adjust_size() { local f=$1 local bsize=$2 local isize=$3 truncate --size=${sizes[$bsize,$isize]} $f } makeimg() { local bsize=$1 local isize=$2 local f=tests/files/bsize-${bsize}-isize-${isize}.ext2 dd if=/dev/zero of=$f bs=${bsize} count=128 mkfs.ext2 -I ${isize} -b ${bsize} $f sudo mount $f __tmp__ echo hello | sudo dd if=/dev/stdin of=__tmp__/source (cd __tmp__/; sudo ln -s source target) sudo umount __tmp__ adjust_size $f $bsize $isize } mkdir -p __tmp__ makeimg 1024 1024 makeimg 2048 512 makeimg 4096 128 rmdir __tmp__ Signed-off-by: Masatake YAMATO --- hachoir/parser/file_system/ext2.py | 10 ++++++++-- tests/files/bsize-1024-isize-1024.ext2 | Bin 0 -> 131072 bytes tests/files/bsize-2048-isize-512.ext2 | Bin 0 -> 47104 bytes tests/files/bsize-4096-isize-128.ext2 | Bin 0 -> 57344 bytes tests/test_parser.py | 10 ++++++++++ 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 tests/files/bsize-1024-isize-1024.ext2 create mode 100644 tests/files/bsize-2048-isize-512.ext2 create mode 100644 tests/files/bsize-4096-isize-128.ext2 diff --git a/hachoir/parser/file_system/ext2.py b/hachoir/parser/file_system/ext2.py index bd607fb4..44db6485 100644 --- a/hachoir/parser/file_system/ext2.py +++ b/hachoir/parser/file_system/ext2.py @@ -201,10 +201,13 @@ class Inode(FieldSet): 7: "Reserved group descriptors", 8: "EXT3 journal" } - static_size = (68 + 15 * 4) * 8 def __init__(self, parent, name, index): FieldSet.__init__(self, parent, name, None) + inode_size = self["/superblock/inode_size"].value + if inode_size == 0: + inode_size = 128 + self._size = inode_size * 8 self.uniq_id = 1 + index def createDescription(self): @@ -751,7 +754,10 @@ def validate(self): return "Invalid magic number" if not (0 <= self["superblock/log_block_size"].value <= 2): return "Invalid (log) block size" - if self["superblock/inode_size"].value not in (0, 128): + blocksize = (1 << 10) << self["superblock/log_block_size"].value + acceptable_inode_sizes = (s for s in [0, 128, 256, 512, 1024, 2048, 4096] + if s <= blocksize) + if self["superblock/inode_size"].value not in acceptable_inode_sizes: return "Unsupported inode size" return True diff --git a/tests/files/bsize-1024-isize-1024.ext2 b/tests/files/bsize-1024-isize-1024.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..e920f6dd3bfd6ed3909a146d44b81d521fb237b8 GIT binary patch literal 131072 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 XYZ), size=3 bytes, mode=lrwxrwxrwx") + def test_ext2_various_inode_sizes(self): + for bsize, isize in [(1024,1024), (2048,512), (4096,128)]: + fname = "bsize-%d-isize-%d.ext2" % (bsize, isize) + parser = self.parse(fname) + self.checkValue(parser, "/superblock/inode_size", isize) + self.checkValue(parser, "/group[0]/inode_table/inode[11]/size", 6) + self.checkDesc(parser, "/group[0]/inode_table/inode[12]", + "Inode 13: Symbolic link (-> source), size=6 bytes, mode=lrwxrwxrwx") + self.checkValue(parser, "/group[0]/inode[11]block[0]", b"hello\n" + b'\0' * (bsize - 6)) + def test_bmp2(self): parser = self.parse("article01.bmp") self.checkDisplay(parser, "/header/red_mask", '0x00ff0000')