From 18df6700ed2319b2a70166267cde9f7ccd7dbd73 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Sat, 8 Feb 2025 14:04:49 +0100 Subject: [PATCH 1/2] test: Add smoke test for decoding file with broken IPLS frame The test data from extracted from the sample file attached to #147. $ cargo run --example tagdump sample.mp3 > testdata/github-issue-147.id3 Tag size: 42998 Footer: no Writing 42998 bytes to stdout... Done. --- src/tag.rs | 8 ++++++++ testdata/github-issue-147.id3 | Bin 0 -> 43008 bytes 2 files changed, 8 insertions(+) create mode 100644 testdata/github-issue-147.id3 diff --git a/src/tag.rs b/src/tag.rs index 8c0f78229..a61a5c4fc 100644 --- a/src/tag.rs +++ b/src/tag.rs @@ -751,6 +751,14 @@ mod tests { let _tag = Tag::read_from_path("testdata/github-issue-91.id3").unwrap(); } + #[test] + fn github_issue_147() { + // Tag contains a broken IPLS frame with an odd value count. We need to handle this + // gracefully without failing to parse the entire tag, because these issue is apparently + // widespread. + let _tag = Tag::read_from_path("testdata/github-issue-147.id3").unwrap(); + } + #[test] fn aiff_read_and_write() { // Copy diff --git a/testdata/github-issue-147.id3 b/testdata/github-issue-147.id3 new file mode 100644 index 0000000000000000000000000000000000000000..1d0e9e3f92463d3db128cfc0f3464476ec2439ac GIT binary patch literal 43008 zcmb@t1yEeUx-~ku6P)1gt}|$G7~CBK41>$SpaGIVaCe8`1PksV!3nNG2ZB2UClLE5 z=bU@ay?@<$uU^$_YM8HAuf6)){q^qMO*ddA5p)0mfU4tX2sRW(T7&=qnu)VpAP1aL z(H8FG1~t@G7DD1UNL=3+?xYU&5i-*xXc{7O7|5KdsVM;I@!vc7 zA08X%{Jr*nKww?Xe?hk1-nJf&P;Wye9epJ9e|h&;5&*zQiW@+@onbxzOK0tl$;%%eQezrwV?LSwub*?QzCJBZy#s452K0BGrosLF%2pKF1& zwd73!g5n~)!h)cGDNy}Y&{QzelGir`8yFhs=o|ju8c52&HH@^CbO1bpg2KH2_@(_X z6}rDFZg#%zjQ_hgiaJ_<+m{|mL$)Kp*cpy&ekUIvn52M!H!|8T$Y}FJJl+2#$Bg7@ z`NEwc3f{KP9xoXGDQ)0m>*EUt=r}kyL!52h{>5ecU%C2FH>fQf%Bbk+>*3=a2rxDI z7hUpyrGxDO;t+dV5r~ioA4t#+$R{dcE6QgFvW4)0KoVl&VxpqL4ich9D&W7-kOBby z<-7Y|C++^>B)_M(BLM0k3KS9(2Ju0mK;ge4Kt4M`dr>|yK|xz_K@m}?tvK{wjv#yT z|G3Bh@>tc|(-+2wbVv*+C?*85ciJ8_ z(AyT``d14AlyI1Xb z-PRE*-~xj>0?+_|mj7%5h}2cUDgYD|000H~1NgIzN()w0e6FjnqXO1c{zm~Sz8l0H zj!FaoxFch%ud2XkYG%%eg+TJDkTP5V30nvpCa?RC=MP!Q|Ca6+|EdE3^L&4`{x`<| z1BPo4g+q|#Kan462+Z3D>8vHv#`E_7~=s31G(-!}cH{D0c& zKNuPX(ghLZ$XWIu%(Dal0No<-{j&}L zHS&8LWfTp9k&5k#cSrP$T#rVS>5?m1_^DK?3WlD))tM{o1x8F`Zg8#hr;z!9Bf&p^ z{;UBM0XUdg*jSi2*x1;(xHx!(lurl=2ncD($cZVL=~-Bq=ouN=xW)L`ID|PF8Tp?H z2m>XgrKMT<6jbCTRm7yECH{(_;Ns#E;uF$5c|s$>&d4tD|2h5X1rTGS+@Rc`p)dnb ziBZsqQT_}9XpjNL_}iENlTgvnF)&fEkcC!602H*pS#$zSTr4cKzeHq~7=wfflT=8a zj9Jesg7Bju@40B9)4^q;B$DF3J&Sq3BqprRrxM@Pp%LqkXVOF=;;MnflI5|YOt z)k`7MxAkHc4lSNlXuJ?9=_6;^x)ilb{j&WO$5T&>BLw`mD0h82%L!CsDt;&xZ>bM(RY6bt0M}ohZL^)@i_4`9Hnr|~Me6Qz7 zyOH0(uSE-W|IL0t@Uq{_s+&%D_z)W#XtW27-83Qi`tcy)tt-K3HGpg+3W&)m@^** z<>@}f)7F$U7gu+lUj&t9so=i#u3zfU^$)7d3^rR^K`q&qn(<$TEotX2uuKxGsy~QV zClQ69&;9{mL*8hZ!vSg(3;q#v&3#=TmmZ%=i>ROUyeyL;erL|o7%&bdgmN+-6DWFA zoJQjIwOs4kCCiJe+x;wyp$Tdm{xxJPMY#J*=llZ58~&0Db%?9=F)sb zPf>FjKYVz2Y}R2d(prO6-nlsxt09h0@R%v*CFLJLn21dwhrX)tiVucY6WNThI~{?H zl2#^VXWv9Xhl~l??=?Mn)fTwH?0gevxF$1b&33>F^*J$l-k59a@?xP5WnReP^kD}@ zw41T0n#Xyb(B{09=VrB8)B^bV?!|Ch`LvIX%!=~RL!mjHk)mF#zrH2T(UnS_tXd}P zi!3p`Iq@_oOB!aW2c0UI+}gqOxnHy3m}k9=F?T&iUD^AvSX;v1K^|9Qv;>o_(ygXP zw;fkCT@E=dIYN>(%J65MoRb_Cdxta}jg3Oz-cq=cf@>@=9X|Jqp7>vy5mbaxTNT%b zJzb;KOr3-%zowui9jJ|TtEUa(FHQqX2P}g9Pnk(`*;75#w$oE|zVV)GSkX<%DNyR8 zMQcl`T@}#1#A(6ORUmqez7Pr9NvY$ztu!#0VxgemKjkVSd8~-MC0IYfB?hwI730no zp)=t`lg=pEFFfRfDh#{qzHczY-9z*ttf96ZgG`*S0gasp$7Zk7SwG(mucdhm5voV2 zt(g*d!VJ`V^JvysJl0YM!e}>#vn20uTSzcMSq@Ynt`4%?ZJ|>P6FyN~bir*%DPiohPC~(tqb(53rW-I1tELZRr znW4w2+W@0Tw#UrNy_E;V(PL|JDrV31E2NX;DTirRP znBQt>mz)5<0r z>}ZNK7RgKr03KFvmDkBJ-oY1?u8m0X) zt}=&0l}}e6=D}BzndR&v{Bjez#7{L?Rj=(5)8FX6%CrAUX;7rO@{7yIaDMD+BcKA78Vt;BPA2Dq->!T zX@XPw(Q-bDK%Q3CXX;6-K*cIm`-ZDs3 zSv=W)UvtaXko@dSp=>#5_roW7lQUm(W0p4Gg#}nnIa8S+ktn|V_jd~xiUi_|S_w~C zeY_>kiBU!H`w;=GMrW+=R|CCr**z?O09F8AXq;GIMlA*RBb7n*NA*iHF?&NG_q5+N zzhqR~v{PTuwUm^1iqf{98o!1q^kk8``%=~7ntL8AXVTR5HU@V_Z{xpdKL=_AmlMU z?wSzpnA%+IXoJnT@%1@Cg}Tgua&62z=^#YpS2-Qu%v>1}Ep>lq6BibvcUoe&72kRa zBif6C^!k-Usdnc705t0*0jA3UDc)A=l`5W#XeXguvt!LC6C-k4PXXe+47tZ~Bx!`1 z4z!ZFF9P1Y=yw)L^&E07j=vP(*9&*5Of6H$`;#}g?!B%Rx8J~rEosID&xDb9UmfrD| z3s7X11Y?vOJ;+aJ!205$F3}0(Fq~Q9us)sQ2y>o;2B4d@UDubKCIsa|9-An>O{J6*I=0}HCCVTV+eTX6>8oEH2ui&ZMOz3D<)*6%vK-!nNnUYt6V-786o|4>iNXO~9&C*y zpw}f_9vHKxUQ9}{iZlmzN$BtPfhQ*`Ho44$Z$=5Oqh3@iG}$>g(~g+ZgLl_IurCr{VqTAdwgBFtFmWZp@~doCX#2o#H+&??vsQ}vcznSf)*p&`iwW#lDb~m zSPFHZs?BhLW0OGsOoC3%{GfFvrjk1~17{Xg!ONfympoQTsm9^2cZb(6p1Hh*Zm9bU z@(hV?L|>}A)1LR_irz*zlNmQk2Xbg-&mF)}_cZdDreYJ{=p8;OBc9<7LAeQg%LkF8 zDZ%;J8CIYeWtVZYT~dg>P8tK)M+7v*AA5cf{AvdVpTk`asiAkDf3LHufkGH zA|5EPOd!QK-+lZ@z{C@q+6gnyb7QokPYVTjoM0}iqm4LS4I?ag<~np>3To6&Xx#vn zyW0k}^n6@y5_+*S^TabwODk2lcj^NAghet6Fbt1^7@40k@~4V-||Cv zr7CaH;+r12KJDZ-@pS}w@Oxn?k-8uYWj+33-E@V`)}ilw081fBJ4Lmb=SKY8DwqVD z-95@mE!Jr%PCXo4ek01&^m`=^Gqf95J7eD&E%n7CrBy3LQq8VsROpM8pRL^QT_pH{(0m29Y*I?bmJOM~BQPLp4+L&wbETWhTx&oOT z?&BgSHl};iM}ho^%so>*lPf%!{9!mxSG>z4{@^XS*u@FS#EQlMp!AxFeEP-E3Y&(h zSOg!P*|qS4`M!8mMr1Kp1bRKeC_xys%!JLd)SeDxZj^7?P zmgS)!(h5@AtI|(;$ys%u$-03@2+CRu^rXBSD>FtL7HY4c@#Lek#Bq7=QmpiuVQ@uD zESf5>El{}ujUG8~g@lS*h>fMG|yT< zamqdxI?=X53qdtb)C?}VzQl-3g zr+=zOy*gXF=Ldg}be7Ui{P~hNLZ#v?9rVi>ClS(Uw~V0)8Wy8ve%f%LdhQLZ%Ngt- zkn@rbWE&0Fbyu@rc#51O9GNp$MMmVc#RMduQ?lrV1n@{JLJ!x~_BSWqVAXYunrUIX z#ZxYzVoN4~s_XKXbALV|aW`F+j42k*aj0C+Y_pT6^fyJEESr$-UA+jnJWU*LAy{6G z7rc42bR?~RS8;E8+`sx)rBV2=^2nf1QudM=ThRua9uF*U-%p-$c)Y|-5^@m|mJ z;-rNR7);l{wDVvo6+$b^!s(Tk9w?cF6XNx3#=ez#Y}nMMkUmXS)R%bmI=WU_YWmuv z9TnugSuD|JJ;mENN;i8LFsC1$Z{JDXL=p{Va>B`H6}2oN6_;vHl}dY%-{vQkjNU-@ zd0Zz=7xDcda~)DBl-4$$06mXWP-s{s83z#en30V0ISz#C8yfF%x!+5}Zhg`Bxp2Ia zYm1!z$V7jYo5=fPg%t~=6BUg5lR_jn+#ftgX19Ac@@|JM)p;i}S4iY*5v`cgtnSu( z{#D5(+c4K`v`|>;hCkj#cd(&X?2?@~Eq9VbwP4S;&XIVPC!L}1lFdq|(B^)=muUkT zkM&eM7ud$4?`fA2mtIShXxisU%-ZS|U;xGdhsB;7tjq^U1@GGn@Izp?f^-EHL$Jo5 zg^k<84%gzW@Q$rfuQjpfEskTR5l}xoBMzelpZ6_p1T)0-Le)zK2J&DuuA}0_r>4Bi z%WGn#3#2tu>3h#6rX4BrCuROWA^^$9k%*qa zxTWpnxJXEi#dTCp(4KHVYlu{T=V50<@p&!Hc2Yq!pEh&hh?u)EB(|zL*WX>l+&(bS zDP|G5t{&^e2N`o~2FXOzs+&H}H30clF0gbZ4&R5=Y%&mUef{D0YmASey3alT@+2Zl=~EY0`mQGoiaA44E6vT7oPB zxGP%3z8e})HE_xA1Wqdf)3pzs$e8UZuXi4kr(mo%p>Tp)luQfjWdhqYQY1>x=<#xP z&OE~io*jk6NF~kvpvWf>A974;{fIry;2KPd@8M_>2KRb=Zs!v!K6LP3I0=xU{Ep=> z%tg5T;SyQ@0FT^pvW}hh&dtZ6&!$gI@6BlO(jvker+oW%lV>b9XZXPl`mFcu{;UQG z;C(*(`R&0amP@_(I(Yu(IV+oCjE+9&vD6}gQsmQ|Ea%iWwW@|yRnhB0UayCFR@1fI zEZ!vIRC@Vunu8M~LW?6&F6I2Fp)J=E?XFs}WSKpa6qF4L7Evu><=}4|oyrEhwBz&? zO5xF&G7*1gZP}s}w5ZU1!D|?tNeY*qqgC{9qUrVgc&ws-T7DK?wc*>oO{pHSgKCY} zZtjh$WFErMK)MJZzSIg{oda4B{ouPJOH10H<&_52d9?oSd3`{2>ZpW#fHhmNEpPVdYF?V9CMlSs96mUC69@V2n z)AeO`#U*?gJK&T~+pPnI0aio#xdrsnN2>=5Q=j`sC^{%Qys#AV8qRQyMAqY`4WgzL z8;>bGdG@Ytlf6eh^*os-)rwXgyB-}D`VY}PSONFRJ`Y)+;!KiQf$gdj(7rVM4e?GM zUMU5oT4!5HOPI;Vg4dHN{a>~}QqEL~e(nh@GITm$n!bd{qX-0(ttn|$GX5U-%?P%r4(Gf28U(Yk(>681gui&OwtS?S7|nK+gH z935|wCD^O3)$`e?aW(~k0Rb|uwzK0&Y6JN5a@#Dt=$Nl(0GqR;&q=_YtoQY3;w6D) zh`01n3(h{EnapwS_qvp-KDtKP;wTJ{E$-LzDn@2-PN+3otT#-xQorC_b z(<~Wx`Mr_^w4K2OC6e}1ldS{RYn?Agb1rx#wCCnpuYVT3Kk~AnK2O#t2oY|9=?Yz{ z#$a>rxE1OZPqL9E`R34e5vlF-&$JB`nnJsHcNdOqb44E?Gg1W`GCRx5ywFXjgZk*w~iOXz*LFQZhLb&G?STKg0EKA7#W#B(^#kgtG82Ci|7tLN2%(TEl4Cw_4p`}_tYGQ>Fg?5g0J1Wh9l!J78p5+ z!Wpq+tp?2Cy%+?(#ZycryM-DmwUaPOC>&wB=31mPq`oHFwY7d^coDq@uSw`g#I@H# z>FhQHS~7`qu(iH?vw$2l-9VKZc!i!pW)il`WNBTIN;aZd2#ZG6XG{|Akk$NxGkZs& zhNi^Fj&Nhw+ygU7bl&{Iw83|`r00)yZLdr%-I`^(l!OcYwK1D0%=Wi`T8e3LbB3~d zB&=AuUT$}g#pdMxuJKN>UED8?a4j048ss_dazkV2kVqIVdlQ0N zY-7O1oN8vy;sNn0`ewPBPc%vWR(@wvT7R9e)Z2}HVEAfjaeFgqj-jE*-MG(&OgNqc zEBB-3OQ$ta!D+_zE~)&%ZcbY2b62pH;ZOeJS=*M`ZPN?1pr|okDq_lw=TW88R~d!V zn|d}2dyysPD{^p>>R^2qqOV6tEAEa$w$Cw zer$LBQ1aHEy8vwXAe}gzu))NW7|06ysDSdUd^~k_!OmL;CyB)@h^8g4t~5o=LH~_* zPEftArlFCtR@Mu($$@J1X;1r~JHJ!F@ceHQQ!@L4~n#anBvsiX#~ zfmug_;xFoLSP;r2H+=EJ(x2cZgXxh4dZKH-9n7@_xGirmlbyuV+eV4`w79=5(&aNx zb-4^i`juGUCEoEiwVWipsXfo8jhX5zdPYY>Dv+YX5p(d>uK6hhH;%kCvtU|K{cg`) z$(`o&Emn0vB7@7cBA0!9eu8pu;SuNMwKkD#Ss;+_WaiQS`Q0{4(VTR@FCCs zKLEvS2dX!2ZND`!U2@8+9QJLE-r?_f*@%655xwP378_j_R-(q{pxPWQoksXvxpDws z=$*f;cVK0vMa2Wt(6`b9o$x{H@1$EkO|~;6tQ&2^lVdv$<;Bd|_Bpv905Zxzteopg z-+i!_{C@D!9SKe@o<`^E6r5&jRmOs>4Ma{vXADp>r0RWGh;o|{Ta zjbhIRDUF}>XrR31FUG+~4wC3T0UwD5u~{&;%Zn0SgelUI^9(rDmXwO>WxEZ1D@X@G zLDD>AB)3gZ6C^f>ML1I!RF!?TK6y4l&WBUOE2;FXz%dq50lshy_`OFOr1kJ-JMT#3 zC9GJ9Opo1>I!R_N4iCx^>smT=5m~{&vdh>rn4C7GuS~K=W6sOnOPBTQ(8nFtSdH$- z@Y_I0!CH+~cq0{#usfE?K|JFmd#%*)boVokSL+RqLmn@54oCW$v?mm z1_3)s(iFF`S5ttgPXz$UrC4A9M3prw>O;WZ45zNK(2gO^t&^*5J z5`hM3BHQ>4V?%sJk`rO|2deWX@kh~Aa6^u*O%ilhrXU!O7 z!<6aYN@Qt4HH=p$y}4=9;Y=LL!ZHzE0sE2dKYSr3{6(sUd&8zSiAaPFH04>sxVQjJ zIKp6Btx4ASgnYz3X6SV~3hC4LR~}S)X5Aa-=5%S|7ROi&1!h5XTS9ZnCJC~Boy#4G zWl9$Alh-uXzdWT9!b+0>LwDPmWqMy|`BOPO>|?8ebiX^_wWxr(O*(js;^Kz;MZ+ zGjqDwtjt+wWy(MxMVW6D@xYl$ZJ={Eou{c~N?sKHSvuJ#5?!dtHMFzZ{9ZyuGgHt4+ujUz^){3Rf0q z;NvQ|02*hlth;->VukP4Ysof>e1U9fQGQmSG#kWLAOb|#Ao!-l$pzDv#Waodz}oxm z(-Q)IEr$gtRNNBw(P=b@{t#08ryCgK^nhO^smT0*`c8`8UAy;D3VGbeqvpMze?4p|NMuGARQukz+oVVlgpX` zL&=tnhw@ac{`(T-fsOTOV-vTZ=fcLeLZ0k{^l;hgU!~Elz1sntWljZal=+xlVcqz@ z35;Tm+HgB*s&Zu{EAG+uo8GqgG|bth4(L2hWRF}a&5T>VK%AQ-TFzbIeYDp;2hd@EA^QW!xMu!@U7xbcn1`1^`}shs1|~&T4h1T1 zO|tifb!E5h%X`yRvetdSQFq4?T3~NKyHO|B}Y(OufIrKeo;4|^}2PWFyZ@Z6r52<^Uyr2>uAoJIn6(FjOds347-sV7+ zsQV4Z`XB+;RP%@@awctC$MC3lms#V`_6!P}@JOwHQa$+Gh;%fe8AL&9Cw80&jxLk3 zX#FxVC}*>>x~6xIX}RQe{VnLnT7X3^e1P{=fnFk=rN~(0RUAQqJ*bU=kSSxG-p?T( zw9-GAAa{OdGNbgFg?I!ud(x$Bq{vk|v8{YgQz-^EuoBa>O~phBx>f!(O)kw+lR8cO zUUYM~|Lmv{bBW>)fXUF%5Ujs>q{fOzz?(PrO?d-*?C)lln=`G#i^5#<__c~RSqYQ1 z1t50=b4v&X>Tj6(>*#lvpXpl2>AzHAyN76?pZZkt%GY%QnfHGgj9PQ!KL0U4@CR_A z{rjNGBMmC=k*e~EcGbLACfj3bE7gAJpu!C{%0hjZduJ-Sd(~_;-e~yD&Fd`Ny{)Z+ zJJjfBUQz#imOw$C%3T{Gu(o2%-HKv*GG5+*Usc2WpdAr+LrI%?;&4~}hCX;AOyOR| zT;^!M>w^=eF)3Rw|H-5iJR4^Q^Ihv%#aAJ>5;%O9%-Q*F_iR z*_cGo*Cy!>UWA3f^YRrmcHR6Y)IL?Iq!te*uTfl3Gdi1Aw}$~=AZThCn&?DD$wuAmM${N%ugUoXVMPcu4{ba z%=29kP6vmkFZ zTA~@>(Q4R-Y^bVM45WY_zNc_sRp!75t4NcZ7><(c&}cnkIt%KJ8rB7(C#d{SFc7(p zZ#g?|If}utVHHkmEKl*QdiQZeW+$~LuEdJlTdz@bSYYbkSxHoFwx*VhJ6N-K`8TWId07Z*itzYGVZ|oMn53y7`=kYwH zH*+?p_5jFKwo0{;{4lEV`=SeYd<+`{w%O+LhI;SP<#R%zR}VwZ-| z)V-_TXc`_TFTsnu)sa;8+tST>veh8!ul*sz%qg>KD^FD%F2uV&7S)goty!L-i48^k zvc@A5_h@@viW<&IEFr|ch=SI%UfzCQMEjo58l{6v=hHCd|V!YWtc{5n&{Wlp!DFWn^>^8_#EqBHnR=7Loe�i_FgmjBfY&clIfI!4^sAb@1m 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 Date: Sat, 8 Feb 2025 13:53:31 +0100 Subject: [PATCH 2/2] fix(content): Decode IPLS/TIPL/TMCL with odd value count gracefully --- src/stream/frame/content.rs | 44 +++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/stream/frame/content.rs b/src/stream/frame/content.rs index 858112fd9..5d1202295 100644 --- a/src/stream/frame/content.rs +++ b/src/stream/frame/content.rs @@ -596,12 +596,21 @@ impl<'a> Decoder<'a> { Some(result) } (Some(_), None) => { - // This can only happen if there is an uneven number of elements. - *last_string = None; - Some(Err(Error::new( - ErrorKind::Parsing, - "uneven number of IPLS strings", - ))) + // This can only happen if there is an uneven number of elements. For + // compatibility, we assume that the missing value is an empty string instead of + // erroring out and failing to parse the entire tag. + // + // This is in line with what the Python mutagen library does. See this issue for + // details: + // - + let first = last_string.take().expect("option must be some"); + let result = first.map(|involvement| { + Some(InvolvedPeopleListItem { + involvement, + involvee: String::new(), + }) + }); + Some(result) } (None, None) => None, }) @@ -1711,7 +1720,28 @@ mod tests { data.extend(bytes_for_encoding("other involvement", *encoding).into_iter()); data.extend(delim_for_encoding(*encoding).into_iter()); // involveee missing here - assert!(decode(frame_id, version, &data[..]).is_err()); + + let content = frame::InvolvedPeopleList { + items: vec![ + InvolvedPeopleListItem { + involvement: "involvement".to_string(), + involvee: "involvee".to_string(), + }, + InvolvedPeopleListItem { + involvement: "other involvement".to_string(), + // Assume empty string if value is missing + involvee: "".to_string(), + }, + ], + }; + assert_eq!( + *decode(frame_id, version, &data[..]) + .unwrap() + .0 + .involved_people_list() + .unwrap(), + content + ); } }