From a13ae5d97d08d8c0fbd41865cd7fd8f9e54b2e37 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 17 Jan 2022 18:53:03 +0100 Subject: [PATCH] Support Type1 font files with incomplete /CharStrings definitions (issue 14462) Please refer to https://www.pdfa.org/norm-refs/Type1Fonts.pdf#page=15 for the expected format for the /CharStrings entries. In the referenced PDF document the /CharStrings are missing the expected end-token, which causes us to swallow the start of the next glyph name. --- src/core/type1_parser.js | 9 +++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue14462_reduced.pdf | Bin 0 -> 15793 bytes test/test_manifest.json | 6 ++++++ 4 files changed, 16 insertions(+) create mode 100644 test/pdfs/issue14462_reduced.pdf diff --git a/src/core/type1_parser.js b/src/core/type1_parser.js index b6a32c321..13459ea70 100644 --- a/src/core/type1_parser.js +++ b/src/core/type1_parser.js @@ -512,6 +512,11 @@ const Type1Parser = (function Type1ParserClosure() { return (this.currentChar = this.stream.getByte()); } + prevChar() { + this.stream.skip(-2); + return (this.currentChar = this.stream.getByte()); + } + getToken() { // Eat whitespace and comments. let comment = false; @@ -604,6 +609,10 @@ const Type1Parser = (function Type1ParserClosure() { token = this.getToken(); // read in 'ND' or '|-' if (token === "noaccess") { this.getToken(); // read in 'def' + } else if (token === "/") { + // The expected 'ND' or '|-' token is missing, avoid swallowing + // the start of the next glyph (fixes issue14462_reduced.pdf). + this.prevChar(); } charstrings.push({ glyph, diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index afb7f86bd..068bdb065 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -483,6 +483,7 @@ !tiling-pattern-box.pdf !tiling-pattern-large-steps.pdf !issue13201.pdf +!issue14462_reduced.pdf !issue11555.pdf !issue12337.pdf !pr12564.pdf diff --git a/test/pdfs/issue14462_reduced.pdf b/test/pdfs/issue14462_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abea79c1bfb146b3bb31b54f15fda7aa34dd1fa8 GIT binary patch literal 15793 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

@hSj{6lF+boU$h_BmgEIipt`W;9* zY{9!?1EThsJV})#a*(RT7ElsJl zO7q&+RaiM}=sd;T@_7A}W{`3F&8_3(S@kE=n&eG>dA|#4_}@XBNMM0&`4~aq0%hxr z8n@CUN|g#y?t6iz@l1S7Mi#0;L2;uwRvk6+)+nwC3*GtFk?n!D-bG0saYBotJgy$# z3b7IKSl@C*Dit<1iQoG(-w1dg#AGttuCnT-?^Vpt>X~#C@JZ-5Zs4jXjg}MB`j@0D zTMuo-c51&}x%cTxTDJ1lXCf<7yyM=U$eST&k}bYPS9JQK`j*YI6&Jqhm%7oJ`KaJ$ zzpbqoF!;Vv-B;b_(`nKa^q*`#GR|T+mbe)EV||eH$+(7c_jzC1^w4zYml4!;NuReh z9$f`5vucjg5=UsBJ*G!~(2>D@A+qzsyOf_FWO=6eRo<>xld-awGm(RD#egq%Q005p z$jVf3ou#>KMt7%LL4!R=cxn0u%a$%Ey8Sff_l5`?)!|!_Tt2%=LXzwr)yR`J|HiTx zz9k0+mRT}Z7v?AhR9Gl@Jnu~6pox(aa)R%_)=$5hXBA|GP41?_W?ZafWwm*Qm8k;+ z*o5mJq_vFBfJ>I5_705&lbnM@4$h}Jtro*x3y9uwQf$Kh;I^9}(Ng#a>PRpfLZVxD zcgEw+;-1W&>b#73pywHSKp1(?CExm+r|$Us>^2?sNwhDv-;nAlRH5>5dS{W#6_`4l zB37{i1T2PWFHBfE@gDdK|Ed+ZwK24CFis*_?V9?ep!er6eSW~A*CIXR-dc1qmEO)-KcpG_p=enPLRzz({+NKGW z7YCOGbD^^rYl?|PMrXPOuPo!k6_j{|( z$!vssu`WBxGkR3{D6}oH_bMZ6eR5Z#0JR)V$T=0M3oqaAZ1u3dbZRk`G|5S;RP$T1 zf?72B%E9`eTI{-NyT*XJON96ts%9x=>Z@pzhBz%tF|^tT zIGE|ab{+>Zt)aFV< zAw^6rHSI;^uje1QziMQMtW1B66ePTEqnJHmR6cwO)!(FIGnzHq8*`I3bR* z!*(R_&S+6q-eK*!u`>#})*jXP`~LBi;Ww*X-XN2UpZh7~+;N5v_uq+#?@;$Z9fmY} zabt^cBNz#J7qf#0g?`{ApUh?3_iMDZDOAO#iYDfj9hY)Tt*Q-n4Q6_A!kOvps>@5a5NLDE8)o*@ERZt$VKnH| zQlt#XY*yB_gWTGNv#jhUb`T%s>MdN zCK8zHZ0{1RrO6Uu{%Uh$uvno{M!y-UU!W`vFbe48GCK3m)Uyg#iqjfO=gU93v99lP zcobmoLvSrbJxym%I8gUJJn+8xhxwo)dXh$&xqfZglZ=;~k-nvmqssXsR8lZzi17}K z#(GfKmCiq9U$w;V@YLay3@J^!3dl;~QA3|xoK@hgl<&N<$mYs~p}j%{JCD=MCT5A$ z>NgqTo5=5&NTYZU=~q#ylc_AWh8_Fsu}Iacw(r)Mck@_GD|oXoBX%eE>HAAII>IO`T!$nKp6o=r^g&J(HozWs2*cpD!XxLxBXMZL73~|LeiYf_!fs#RD2S_Ir}HR@R|6e}vXPijO^K z2xalVUhy8-fEHT3q&9C>>qGbFSkfhI9*h^dZQu_lwsqHFc8(Qq)D6>~C@y!uUO&cZ z^&u&a*6t+x7@3sMHPx6@5qFs7!vG~tNb&RFn=Ef~VhXP*6rj48f?ZZgvymG7&@C=W zsdulQw%GBo_uJ=7mCbvAOW$ z`IjsE#w+t{+ntiXsq9qF7#gH3KyUD<(kxH)J?8nOAEvq`M|Ir6z{}GNW`gZrCtEU15H@Q?g|5l9Dr`Mu z$**p~SmTiWt6!R;?>!m!&+_lQ0%Zvz$LW`XhdM3X1*TjZ$X1xPRXKKNlHD0mQwh$0 z7wGyb_d0FA3CDX3`rPjBvE6~5eJ?>jRUJijLQ5%N0Lw1}`D2CaBj5u#JyIebk z1&@7rS%sZ3kkaZwE2wlLeWHJ0GWVgc!r${FO3A`u30ajLo57a=O3}yqYqJE`bD6F4 z(V_iD;bl+On9X<`+?aKc$N{#JPB9weOKI)j5f?m7zE=IJdQ~d{i!pjzHCC>M^uAO^<>q(@N3PVKKn)m zT3W|X+t%(+m@^)#q5RS~CN!MM=#wPZlKg(PY{+!}25IYi-}3?WZAN$_!I%L9T zYw`*2D7I}PQX(q92~)Jp?^8|lb#@V!o_p%jp}Y}L*XI>K>df7b8TUKrK7SgIoV4m) za!Ta20l!I8G?{m8kgTrhfVnAschAk#WL%(6diDPN5xwr|@I`x;AZx!4O#sjDSJW?W z&7YzCRG4Xc|BA~b1u{=i5IBf0l3j106+T*^7;c(x^WXtwgqNg@J#4tbu6^-l@TK4h zVWS@Sz!&?Z=ZZ7(TrL(zyC_}n%i@Br%j<>D$E?Twnx}UJ8h`4Z1xc`>;lr8X2rkW_>B`&XV2nVAtR@( zAHNALW4Q@>dT#e%d6~XVVC9i>h3bdQ&V1a$L5JHVezCRkT(Ik0#O=PDm#f&7+UQ(y zPqW{a*vkFG+B&?Q3HsGWdcmiuwTJv#J>6$1qHDvigPHWIFx4#0hAsmyZPS>%JKhb4 zHg??3cPq#$D*7+s%J>B9oQ}??qwsu^z{u@K}a5p}$W|CohUOsr+ z*5imJn}d3+T!+8VB|#;SsXfxNghcb(5vovJb5xk7twOj_*u5R3Shha%dc61aXj{1D zV~2G~I&^?KxO}VaEaY|Jn)D7utl!qE#yXk%5OIR~#hdLqOqDQdjwv&>*~ z3`*0S$;cl|v4ZcrJ4nbBi*%1GC8_T}wD_vDD20`LH5~zlG2W2G-h1(}{;B9TxY+rs zWb0+JkQ&4D^R7RmR<(G^B-9FcyB%^x$mUd!sS-;=+bc<2>8}@>YCqry7og2B{SemZ zGGk%oMy79!1iiB0U7+-mI-=bqO@WfcTqgdh9-1x0!ZJ4S;ug$EOy0t(3$XfJR-~Ku zr)s~~T%b7Rc%F)ZGBr*p^}BIA-^xp+x#rQ7pGNYZ_CJmCXNb*;;!?EIic0u;T-2NP zhVduBM*n!(ACckbBZu%j8+%22^)bxMF`#bTjIJKr?+cZ`ynt)C=_D;JURKC&Sj1Aj z4o?}jt?NKPe~uaJA_)cfEtK1lQNtm_T8*AaBul1Roh~JGJSXLcR_ZtT{n&(pkDEWI zoi`5m8b_X=)95oD1&C4G51V|P*E7@KGw$4XqP&4ZDsLu>6RF>K6G(F^Y1Gf=NT#`P zD+W+4TuK(%ec>?voOIB~nk(bUF-_jeo8ULo`I(indOS18j><4)nhP>OT(C`TU}q$! zbmS&=dVg|oYCqfDeBDXu3sa=F__3~mc&R$4gC@Q}KX^pZW=O}>F?Z~rUz^r_vD#OAb>IP@1mxkn}z7HsC*PQHT+ue=zk`V-VcIR@I?1 zIKnq%%uw~PjWaiy+p1(*OQV`fz%KkjVz=C=e^pNk_fXqFl-~Sax*#zDX2{0lBI4)} zk6!U$^P&u0sEe* z+grAv?yHo6u`OwLKCMw}sC>Z}%6>z}+_Si^r)dJa(r7`>?)DfY&n_9eM0Olou-`GL z6J#WLIoHGm0zX#A5wnaawe*{L2Ss}38f@MhWR zKu#BCp>s^bwCp6qG2PNxN7nT}_)f*gAwQm^#jr_ubk`rtk@q3N#)X#NK>{cWF@7B-Z!&)ym@3qP0@5B;?vvAV0s zrYgCd9^S*Fbbs@bN_lJAQfLE)Sx1(%!kB1iTK#%h;OU##<`15aO`#9JN7RgC?9HuA zGP#|#>#bRqP#P%&3#WKqrl`^=WnxWrw;xDLF(d@6Jm%S=m@X(r2FKtko3}t#%8bO!Mu< zZs$J^jj9q*(0?92#}}W8tuZf%&v@Irsi)^UboRO2$2u>z683K1O^6S*L@lHvJ>_67 z*1i75U(4M`E9QV#)}OTaM)!ir^TwI~dLnG9*VDPaYFI{MQg7*p{AK89u1lmQHIYYlKoVqul&YMoEd7! zMP^gti0N**v1GeP@0}j{rQhf0Y~gGZkKrM%xfkoYzb6lE?((joCZDAjq!|!uqmtS7 zilBb-r;rLn7g6|{Ht7DZ&rNZ}@-SN*wgh)EW>RN$!2tnb%e8#DCGlI!G0Z4?o#%EoNSLVNU|q<`Z5=^CSccQG?X z_mT#b$K2n^Pwed9FzC5HxE=0F#CP?x86#Ii!;grcHTl^u~o|?dVFSl5FNOply6VIP%bdh-(QS#tR6o=+Wcq)sg46>-Q!GGYGig zrWWK;=FJGyR>pV;Eh_FpmoshfgZgc`AGjH8k`|tp)>b#fh?N>_ z1iT$$?Gc`qVzQIq=4iV9Aj<7oJ2xd>Fhw09F?fpnq}oh)_mPO=ZWd8Mh`jC8+Gv5L z_L#J}^7124gcT)O%OV=NLZmn~ss4hL*zpt@|eEjzd>f`LuDIhK$bqVDbi<%$EM%T;9k`T9dfUoQg}7b);R(T$>ijoVMVlEb{8tUwc*HO;a;(t z`eCCdH=dNTNIcj*&B@4X;hj>8I?6DNZ&4xGlH~St5dVqA=Cg*kJDgW#$h3i!n=@O? z6Jg4`+yk>Ko=Rt824}ActG~-dsf0J#xYZ&p;e0K6`ASluQkX_wgN!C7U%PbXVcKHf zW2>QF8D>+1nVa*h!}i)UgcxtYzl-c(L;E>MHSy`LH76CcGjreYpPIFsOQ*ihE0 z)Uv_I&e`h6`v*AO8?>>8Gl!@X@_G_Y+A(VeM}2_)bt`utkUeL9v#8rl|78f>W34HkYNZ zxxD@4g`Zv)+U;Cgl)`(6uoLGsiEaoJLDKUzVE?TzGb#+`xXdMf^sdOQt9Bq0FHOEn zn$(Q~$kfz{x-(FkL%cW&k_h-`-q`jSQi((c{%M@N^NUH67vgkhf&^AB0szQlb zWXDXaj#5S1^c6O~WY{rMgSSme)L-*hj-8m*3KX$UkkMIjOpP{`RfB;SkwbB8@^;d$ znlpIy&F4LfL!w{gSbIxSa)bw5oxe?T7-v$UrweusAvhRqyMdloZOaE+l+F3TzXP8M zmYDON2YUVFzyGE9WL%9jfPL1lLS21q{?$`2-rzXrE!l&~pXS#KZ{rp&lXCeBJl$gUz^8tgcCLxws&;*#Q|l|V$5IW4asVQ1?q$(i**<$f&87$pXc{X@@!kI9K=I;u(q zz3`Tt7u_WElc~^koX~EGHD7Z}M?>zzj_xHIXG1?2iu#{^VrX?>7?heAM7qg&p|qc( ztjlM-!*@9uC8w3yi&yWoG=#dPL(7hrOO!!Uf2FY{-eJ8)V%PHd$-T{odxK*a52+~G zPBahx40`jk3`)N!$DEoC$6sDmJ1F<=G05uoYRAkcso(WYe34?|z2UehoI=Mb8eL$N zzhbXIWlEWfzO!@&J+?pCGnRStDK>sEn^3lMC#uVwg67J~bSM6|#Y_rs&@LY}X(-$C zJzRZ`pS%!;Hes5Gt!xyd`I@s~zkPcN_CS5BpvR{bdt{4Mcue~Owlh$DzEc=J=|~5k z%;?D|M<#ETTGNBL`?mB(M3|Xmr(xYfWHtt~;|f)rU|oFPSxz?ICc7YI>^@!U_G|Gp zpF#aq{HtG}AA>tFO;nisVM+&a5BLZoR{+m&WEoE+TAa zeJrpn{KapwD|^W!{d!1t=ot#S->2)z7|i4z#WMmlYkci0jk+C3*Qou?y3+N9=w z-5F08$TrS0Y!IWL)9>(|J3($ZD0u@M^Zc9Dh%AS>#qpJbDNmXaQzVjY3T#-b$xk5u zPl<}?+J@1 z5A(Ef>Lcg&Ov%3YyvZ)Bb!qW@-B@#b)gL=3UqabS(-p8KxBn|G34NrfdUEh#v-C2(kFBtT_tPxBC`t(__S>JQq0lEZQZK=82it+?MeMG zHnRAI^}1pFHiC-?*Kt$IT&O@m@Y$0AeaQ~--lM{ZR7XG?x4f3xN zKCXY&0S-I=S8ISV|9|QL=N