From 4ecb7040ff203fb9353c4dc5aeeede67bc2403ac 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=( # $(( /group[0]/inode[11]block[0] + block_size )) [1024,128]=$(( 128000 + 1024)) [1024,256]=$(( 130048 + 1024)) [1024,512]=$(( 130048 + 1024)) [1024,1024]=$((130048 + 1024)) [2048,128]=$(( 34816 + 2048)) [2048,256]=$(( 36864 + 2048)) [2048,512]=$(( 45056 + 2048)) [2048,1024]=$(( 61440 + 2048)) [4096,128]=$(( 53248 + 4096)) [4096,256]=$(( 57344 + 4096)) [4096,512]=$(( 73728 + 4096)) [4096,1024]=$((106496 + 4096)) ) adjust_size() { local f=$1 local bsize=$2 local isize=$3 truncate --size=${sizes[$bsize,$isize]} $f } mkdir -p __tmp__ for bsize in 1024 2048 4096; do for isize in 128 256 512 1024; do 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 done done 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-1024-isize-128.ext2 | Bin 0 -> 129024 bytes tests/files/bsize-1024-isize-256.ext2 | Bin 0 -> 131072 bytes tests/files/bsize-1024-isize-512.ext2 | Bin 0 -> 131072 bytes tests/files/bsize-2048-isize-1024.ext2 | Bin 0 -> 63488 bytes tests/files/bsize-2048-isize-128.ext2 | Bin 0 -> 36864 bytes tests/files/bsize-2048-isize-256.ext2 | Bin 0 -> 38912 bytes tests/files/bsize-2048-isize-512.ext2 | Bin 0 -> 47104 bytes tests/files/bsize-4096-isize-1024.ext2 | Bin 0 -> 110592 bytes tests/files/bsize-4096-isize-128.ext2 | Bin 0 -> 57344 bytes tests/files/bsize-4096-isize-256.ext2 | Bin 0 -> 61440 bytes tests/files/bsize-4096-isize-512.ext2 | Bin 0 -> 77824 bytes tests/test_parser.py | 11 +++++++++++ 14 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 tests/files/bsize-1024-isize-1024.ext2 create mode 100644 tests/files/bsize-1024-isize-128.ext2 create mode 100644 tests/files/bsize-1024-isize-256.ext2 create mode 100644 tests/files/bsize-1024-isize-512.ext2 create mode 100644 tests/files/bsize-2048-isize-1024.ext2 create mode 100644 tests/files/bsize-2048-isize-128.ext2 create mode 100644 tests/files/bsize-2048-isize-256.ext2 create mode 100644 tests/files/bsize-2048-isize-512.ext2 create mode 100644 tests/files/bsize-4096-isize-1024.ext2 create mode 100644 tests/files/bsize-4096-isize-128.ext2 create mode 100644 tests/files/bsize-4096-isize-256.ext2 create mode 100644 tests/files/bsize-4096-isize-512.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..ebf15d2726194c03abc7e4bb05e2698e66eb20f2 GIT binary patch literal 131072 zcmeI)J!~6Q902h1B_vWPQl*yfkGhpQ71bF!RGEszzyK2qLnY&;E=lG1D#vbt0SX&q z#mIn=SYW7xSdj=H0|O&S2&qfQ7Q_I1_`f)p54%NHXe7e@p7hV%yL)%O_q+Ssxu>(U zOd&v^sse|jsb z+1Z%n5owT-Kc7AK{ukLxe|~-Q%#m2Mt2CC1m3HH;)=H~iG_JOKjiuJ&QnB1? zG@JdEE6wJv#(S*XTDx)Xa{kIkAAU7^AHB1Q*_-_gP{z4p23;>Mhe;NxImNeb3@tu0?`^x;uFH^jJ_s7q@ z{|wFjB|v}x0RjXF5FkK+009C72oNCfAOxb^v z5fD`Z1PBlyK!5-N0t5&UAn*VL*3$Do^Y?oGC(oYPvH!Sx*dC-=|)a)&AZSBpV!aqFA@<(kQ+zpee0{$;plsmIdt z`QJ26`JblSjphHgg*gI~2~3**lkH6_0t5&UAV7cs0Rja64+81l{!muSPsemPpXaBe zl77SQXf~I3iq-z9OU0mjarj$#hqIYlITr9pwE2E&X13qzz0vMRMIk`oKnbKg-FlT|IJoE{T^$`n2lx11($w@vKyn&9@_F#>-Mi%d`rLb$-b)gR0D*oL7z+bm3NaL7 zHpD=PT!{5_G@ONq-+RCMwj3ju)azHi=NjLO`S4LAwaV=dxup_EL)%kMaPHDbWs}^pT77CTpbfr4GP$(8_^EZpd4PWju^L6F) zj}Ob2W>#KaxR)$Hxg7gDx>i^FIJ&HU+hQ$~%^!|zzL4?!aK`)JuicMpb1=k?5VK*W z<{Pr9F>7St*DFFf-1zJD;t#|u>^&Z@6XY=vf`EVt? zfNX6)zKb+dJbJ%e!*KYk0!t4-hYc+V1(2PY$*9 zVrMwt6(a82#r@5=Z@4GK-VpH(D(;W&4{;#G!4Q9%o`?At_g=S~e{o+Xruh83+c@j) z&#TItbN4$Gtv~JDe*5!xv3hG^dVQz2LuDNxbABut%C+V~od53zhK6gUh3n;7$VdbTWJ;j z0qZ}#p&AHeRlxes>YdYX0_g>;|MZ4xAdpo7>p!b^PQMAH7qI@*8>)doRt2p8tll~O zCXimh`cH4D1_A^K5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N h0t5&UAV7cs0RjYiE>J1Y%~eNw-mC@*5cm%SegPSIXF31? literal 0 HcmV?d00001 diff --git a/tests/files/bsize-1024-isize-256.ext2 b/tests/files/bsize-1024-isize-256.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..9c6536a33df1409fe9448403c9603e9bf9bb3bbe GIT binary patch literal 131072 zcmeI&L5Lew7y#hO?7GFZYO7T|R2l>ktTa7%kVOzL(nIM*#bZdfsaeS;noZQ6tOsv` z9=&)Fy?YSEgNK5m_E7QY!IKDrT0{{j!!}p&)`pTUwH`IW2l z3l_Y7ZB@D0t99S ziZB24{98n^tP0bsk4Bd90F-i1zip(L{CM8Yx>-n}G+kWHBg*?Rd_L=tjusK*8^}4OI?QSd_u5HCx&$97b zll+T&-}3&qHr;Bv|J~}32J6!|ebZIDn)&_k>CyEX)?-C+|NG5T@8@a%sb03<-~7w{ zm?Kai=H33*@c8-usCRBM_8-btYQmR{sd9Lu^|8e literal 0 HcmV?d00001 diff --git a/tests/files/bsize-1024-isize-512.ext2 b/tests/files/bsize-1024-isize-512.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..0f1c35f6d956776cdc08624c9ebb82a52cd14a35 GIT binary patch literal 131072 zcmeI(Pm3F67y$4|cHPQa-B#QB2f=s{l+vaY53;A)vv?_}cnRrl>aJunnoWwHY_I(W z_F_v5o_ZB8g@QfkH}EqE)yskkVtn4Dvm3ImhLwQ3^LydR%$s>yF8xv&woCO`G%Uq>Po-Kl%ibDI zhTHu0+k0=^SbX>Wd!3tGzc01V4_6p_sjuZ5t@`K9jb<;eUu|~lYt5Cle7#$5G&M(wL7Z(Usda%-vm&4o{YNc(&A@z%!svF{IHII<|NG)U?8na^WcT-4y%r1pc=^tIMWp>m^E>UUKOI?kvy$qsJ$`eu)n4!PKig?y zZkIs6vyykNtank85GDxK$IOtI6;u5dv)x;(_NiL#O<0LMw zZi3+AE(qdK{DB|{f`gs>0|arAE)MZ|+gvV9jf7kRx#au8)AxPv-uLp}=XiPP-Em5h z5I|s11xz{dvP4wEl9-UtDN+r!AO#6ivQJy@Y#k9*sa*dR*=eKevTG;lK01x+KL?b$ zAekXCB=KSC)XU|KtJ~$XFQ#vN|MONh?Md;ple6RZt(@gL@w-+bp0-kHCsT+glWy)# zGP$R5o0X}LPcEN+eC^BA>7{R(M-R94c*m;8sy~l555KRQDQccc>we400IagfB*srAbDCJX5el3%?SCgfLvvS)`xyeGJ zl+Ri#c2+jJiQ>GbsXS{w|2;ZA|BFtkkg9#@%iGgh{%X;@(yXN^JG}RQb*|^X&i(ex zf8T-<0<8(OI{#Zc8m$mO009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I~?40{Yv2V=7|INxoY)j5(={N_|p|7+I(2o>_BB`BmLcsc{vJc;5m%DE0TTXw0<= zw`^A`Bm@vZ009IL2!()N=j+%1-?82GKNN#!kO&}v00Iag(7wQM`(5dY00IagfB*s^ z6=3}j>4jt12q1s}0tf^UVEqq(M^^+8KmY**LMp)eAJPlQun|B20R#{TAi(+`0FSN+ zAb zi-<)R5p>X9u)BjOhz^3_a{hivFKMc`92iXQ`-30%CwKSmKKF9(ns;1{ArL?ys{$oC z@UCP|(vv(bsbTG>S&|XSk__JMy>>J$6Ghj*S-oZ6%Cvmc3tdO!sAO02lB6v;Bl+v) z?!xBW)wQkJ#}6L1pYF=6ktjF(mQ%i4Yt;h3yiseH8?}1FZ??*2q1s} z0tg_0z&{eud%JmK*^4slkK6X5Oz8dX8B?%bzY|gOHDZF=FIk!6@b009ILKmdXNLm>3(zPH-+oRw-=@t1Eq^`P3Wgq~Yl fc3hbmR5}-RPaBTw`uYzo2m}y7009IL$c(^m%dvGn literal 0 HcmV?d00001 diff --git a/tests/files/bsize-2048-isize-256.ext2 b/tests/files/bsize-2048-isize-256.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..58d77338df1d0b432c97a48fbea68237b1585eda GIT binary patch literal 38912 zcmeI*&ui0Q7{Ku~lU8S)^~cE{7*J2bI#5J<&q5}IP|FyFE3?;* zZ@+11j)VXL2q1s}0^=;;`-z_6`6L7oKmY**5Ey@f6NcQ)BO!nQ0tg_0z$6I-KmLPf zdtp2W3yu-R<@bxyD|vV|IR2^5lMsDI64vuAOWHmaKfbK7`Z`;kG=CXB2>}HDlfcRo zIq;p7HF*AubkW*2i_##y{)7u;MuV?jme!-UQE#F=)z1ym$B^!e4UtQ|>b=j>S?)baMA%_402q1s} z0tg_000IagfB*srAb`O53Fy7Oq!BY`W!cJ`=ByO-KJQ^;+N?MY_so*x)rzhAz9}Of z3+@H#J>ZXtc*4!s@7k^uNC+T+00IagFcJc-=egba|5u_l|BpoH=_CROAb< zBY*$`2p|wW0p|bceJ1n>0R#|00D-UtnE%5TrhNnuKmY**q9?%oAHC0n9wC4L0tg_0 j00IagfB*srAn*?bN_M5<=s$KLA%Fk^2q1vK#0dNbK8={z literal 0 HcmV?d00001 diff --git a/tests/files/bsize-2048-isize-512.ext2 b/tests/files/bsize-2048-isize-512.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..969c48ed2e818dd2df239e5b987a8c638432feb9 GIT binary patch literal 47104 zcmeI)!E4h{9Ki9HOj_Nht2(_J)Ez`vMLft3G7-U@Jt}lvo7qa6xHgr|i}U8ue_^2b zHwcP~qKFrd;ve8)AYMESFZK6po3?hgben~)`964iFMTh`d!Lu^vZSdo1OyO>s(>RM zUzZq@n3s55q6VuG&AenJI+A?)`p(s8nQHasPpei(m!+r{bR7*7`o}iray>C)l3t&A z@bdP>g+q_Crzf5{rPo@eJtT8}(M_(Ui|N2m-cOg3xpXGy=S#^{Dk$DdrP}N6HovgB zbtN%%PSbv%kFEV{0RaI7 z5I_I{1Q0;re+#TXk}WPKobA{DR`dFAxBEQN$BIrz9j^a6Kv+Zo0R#|0U;qMd^#0HM zzwZCo#%bH%VaXqnI3+P5@u;PX%A`cL2e=ym<4_y11r zp(!h|7r(o$?nuFwz4|$f+78XP>f4*~*dto9cPno|Ogt4ex0)ZWsJ=aDLgZc-i_p;0Y76 z!tVm=cY@!?WAPwey5j~z)G3;R00IagfB*tL1$3UDG_CpnSG+#|_gslW1Q0*~0R#}( z{{r&+Zv+GoKmY**5Qvxn^MAw!obDok00IagAOg()90mv=fB*srL{EVEKYC+Mj}brs z0R#|W{^uA#009ILKp=Vo%>U6Fb9#&b0tg_00P{b`00IagfB*srAbu0R#|0phMsf#pR_< literal 0 HcmV?d00001 diff --git a/tests/files/bsize-4096-isize-1024.ext2 b/tests/files/bsize-4096-isize-1024.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..7577968671c0da5fc477f86837767746acc628a7 GIT binary patch literal 110592 zcmeI*&1+mm008jWtt8S!8lh_2i>pv52wkNfN>JEbiYGz539@XruO_nDr~6UsK}av2 zJg66;3N_G^e}LygJqm&sy?OCe5HFteu+Aj=`jRz)urV}Ae*=^G*qM3reqrFv%X`@n z1OfyeSAj-6@wFIdV$5Q^6k`h2aoqTDErdoa|M=_uEX7I~jo$vV5-Q`mm~4bpPGK(n zcp`+$F-hZ`i1G6eKl$vtSC;sYld)R*(stp0IpwKd4=H(I^=a;v?Z zuk`B8=3w=MW^-HPDGQB{-uYs^@#eeVpTF_tr{Da(l;%4>9xI*Kl*8`YtrltVw&tSJPJrh4bUee%4v(4sVuCrs+t?$16iviR6@8`o_d&+Of`t9czilP3K)?!WZ{BKIr z`cG-u(E2Ye-<1@2V#O z0t5&UAV7cs0RjXF5Fl_w1nmEh$S=w?2@oJafB*pk1PBlyK!CtL1nmF!fu}100t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBm#^a9ISr<0$2^z$$S0t5&UAV7cs0RjXF L5FkL{-~|2!Bs!CN literal 0 HcmV?d00001 diff --git a/tests/files/bsize-4096-isize-128.ext2 b/tests/files/bsize-4096-isize-128.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..23e510476958f1f843edcc7a26cf221a225c9ce7 GIT binary patch literal 57344 zcmeI*F^JPp7{KwDoVHp|+rd?II6)9Df(X*Zsvr(-ZX%RkFJ~)la-_+jxKuY61s$CP zL2wWpojgz+6dYXcRs|6RaS_-0zBak0IV+fYwpafjJo4Ua`rga$!lRGya!L^hAn?Bm zl=OwSb;{`E>2zEt2{TOH58FzWbotHtOIwnmI-QH(3}u9M`p^w2OYG69tgjI8!wspPItoW|AQt_->rCM|Ao>eaU&E;}=;N+Br z*AL#_cs_UT-Q6emZl7H_@IuBr8@46am9p92el0Rdo-~)N*yd%qe+UE+KmY**5I_Kd z$rp%zpYPB^_4KcQQ%R0M009ILKmY**5I_I{1Q0*~foT%xoEp5E4uJpy2q1s}0tg_0 z00IagfB*v1CvdR0{-3@JY9DOWPxAQn zw5}=i_ZIj2pHaKQlVy(r`%9B@l>df6`=)MXwY0Ify?_518~0z@eqQkEIo$cY zZ!LPyLGt^Zhr|1i&%Z4<@Tw`_kYHWjd1P4s$?;G|009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5ExBBo-NHP!<^U0Ufwk4bwQq8?pHap;kNvvOK#vS_TH6UP#Gh779`K4 zUga}czv5l7eO(|BKmY**5I_I{1Q0*~0R#|0U?K%%ogZKSf6w>U{}VY_2893u2q1s} z0tg_000IagfB*vN1)`0n>098N2q1s}0tg_000IagfB*srATa3ytp6wdFU0r|KmY** z5I_I{1Q0*~0R#{jU4Zrf=!Ud_00IagfB*srAbUASsj{jygKoJM8AZsNY|#9vTcyEk0ZtBG85_HvOr*@By3adnY` z_%G-nSg4bNgE%-ih@&7bf`dYQo?Kqfqz!6+(Inp&-oE#~_vX#}eA+wiDDP`oBm@xX zRe_uYz9cy#c|r17$(o!-uAf}8ten(ezhCz?+g7bM_0_g)X?rDgDe6h}_w}i^J?KFUl6ZLNP2w*?c~pznRZB zb>3oS^;2~Bgq@3?uRIv}{`1Lko$p{{tUu$};_w?j=2~vuXu}Czk9f`z*7jRo6(EO?qm!!N}7XrfvUycs`` z#(1J~Mn6_tZ6CiGR^zXP)u`}$ryq0X-^z!R#W(GGx^lui|7xl6Ynk@n-T2e*;Rpc) z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmdXLC!lM41})nelQKDWoH42BIZ7U&B_$Hfw=&edo)e zOn>Y}*Zo*3Bm@vZ009ILKmY**5I_I{1Q6Jl0?B?Z>HGh;q2&F4Urv@uA%Fk^2q1s} z0tg_000IagfWX!TWdC~-0tg_000IagfB*srAb1z`3y-Y; literal 0 HcmV?d00001 diff --git a/tests/files/bsize-4096-isize-512.ext2 b/tests/files/bsize-4096-isize-512.ext2 new file mode 100644 index 0000000000000000000000000000000000000000..9da737a1553e162debdd8c05dc7997f3b6527d69 GIT binary patch literal 77824 zcmeI*y=xm+008il(#pklVmEEKLPbcr1gy{x5QOo_iVq-zyJB9IP`soL;gsJb0LPyMgLnUj`ZaBe*|R0#hYRM z7oYu@UHgk^?<)uEzj*!c=q|?b_N$-1yIu2Q*l_BfFXpotzdz;&`{)0iDtypgI-clP zu2*YojrQfiE^^Nav>PjF^!&AA>{o==A Y1Ox~WAV7cs0RjXF5FkK+z~ls;0ikk_d;kCd literal 0 HcmV?d00001 diff --git a/tests/test_parser.py b/tests/test_parser.py index 11278b6e..4f6e82a3 100755 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -348,6 +348,17 @@ def test_ext2_variety_inode_types(self): self.checkDesc(parser, "/group[0]/inode_table/inode[12]", "Inode 13: Symbolic link (-> XYZ), size=3 bytes, mode=lrwxrwxrwx") + def test_ext2_various_inode_sizes(self): + for bsize in [1024, 2048, 4096]: + for isize in [128, 256, 512, 1024]: + 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')