From a2a824ed01dc1bd817d753d7df9a84503d10204f Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 27 Mar 2019 00:00:13 +0100 Subject: [PATCH 1/2] Don't accidentally use an empty `hash` value when comparing `preEvaluatedFonts` in `PartialEvaluator.loadFont` Note that `PartialEvaluator.preEvaluateFont` will return an empty string when no hash was computed. This will complete short-circuit the `fontAlias` comparison in `PartialEvaluator.loadFont`, since fonts which are totally different will then match if their `hash`es are empty. --- src/core/evaluator.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 06951cdee..df5b1c1d7 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -695,20 +695,19 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var fontCapability = createPromiseCapability(); var preEvaluatedFont = this.preEvaluateFont(font); - var descriptor = preEvaluatedFont.descriptor; + const { descriptor, hash, } = preEvaluatedFont; var fontRefIsRef = isRef(fontRef), fontID; if (fontRefIsRef) { fontID = fontRef.toString(); } - if (isDict(descriptor)) { + if (hash && isDict(descriptor)) { if (!descriptor.fontAliases) { descriptor.fontAliases = Object.create(null); } - var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; + if (fontAliases[hash]) { var aliasFontRef = fontAliases[hash].aliasRef; if (fontRefIsRef && aliasFontRef && @@ -785,7 +784,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { try { // error, but it's still nice to have font type reported - var descriptor = preEvaluatedFont.descriptor; var fontFile3 = descriptor && descriptor.get('FontFile3'); var subtype = fontFile3 && fontFile3.get('Subtype'); var fontType = getFontType(preEvaluatedFont.type, From 9077abc2639e59430cb0089d5e79c1934a34bc0f Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 27 Mar 2019 00:25:34 +0100 Subject: [PATCH 2/2] Take the `FirstChar`/`LastChar` properties into account when computing the hash in `PartialEvaluator.preEvaluateFont` (issue 10665) Without this some fonts may incorrectly end up with matching `hash`es, thus breaking rendering since we'll not actually try to load/parse some of the fonts. --- src/core/evaluator.js | 4 ++++ test/pdfs/.gitignore | 1 + test/pdfs/issue10665_reduced.pdf | Bin 0 -> 8809 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 12 insertions(+) create mode 100644 test/pdfs/issue10665_reduced.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index df5b1c1d7..2376799c3 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2350,6 +2350,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { } } + const firstChar = (dict.get('FirstChar') || 0); + const lastChar = (dict.get('LastChar') || (composite ? 0xFFFF : 0xFF)); + hash.update(`${firstChar}-${lastChar}`); + var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); if (isStream(toUnicode)) { var stream = toUnicode.str || toUnicode; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 259a95710..de9e5edcc 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -76,6 +76,7 @@ !issue10388_reduced.pdf !issue10438_reduced.pdf !issue10529.pdf +!issue10665_reduced.pdf !bad-PageLabels.pdf !decodeACSuccessive.pdf !filled-background.pdf diff --git a/test/pdfs/issue10665_reduced.pdf b/test/pdfs/issue10665_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..49d96ec4bb5477058d26a2cce89f59b36be94105 GIT binary patch literal 8809 zcmb_?byQUC_phYV-8G~j;29c}?(Pn8fB}XWYG_2dK~j)L0Rc(rkQAglC6tgBkZym& z8|(Yt_j~WUYu$CvnmOm}y`K0ydw-sN{`fqsnzHiTJdXviSyxs^Ca{G;V33oA9k!?_ zHlPZH+aPQ~LSPX-Y(O67fPlIJ@(vILR2FLKWCg_rblfcv-p)`!7kT56!4?nXT@oYma;9QzCiw#PkSP8B+GaTvA``+BNt_3cKInlS2B=tsELdzj5dlmY z&(TeiUw30*pzBJyXqqgzypeK&g=4yy(gbR$=Xf}bl$~$#={T#8WX|~yM!7wGb);E`C$UVk|IH19(3 zjOXV&k`9Bo^`~E^<7|9s!DI3LkZTrymjrQ+?%c>|A(v{umW@Hm&c?1yz7TQxE@5BF z@FVf1F7{m?A1^Q0+ea^I(s49+(kG3XDc(kp(Ig&Y7ATduu3nRnG(up^Hkve3m`9q2 zzeP3j#*At4p?#`xOtm8uT`#BIBJN3CJJjob}{m}Hne2&L1Sc${$Bq%0OW!7qx zQZJn{Nxp*bmaSaJZt8b;=u$fj{VX!5Ww=QH_dLd8a3^yZDxh8vck{~HvSCy%roD4MA_y(`cofSYa`w?Ah9>&VW7I+G7!+7yz3l48 z%iZ%Adv_D+e{RfD%(u~#@sy}hgUV8k6)I>Kh1k3YFRD;1Ilmm@Z{ZWLzutB;{ppo` z`p!4AGfVl)*s4d&j@$GTbLTgki9In8{60#fw+O{q@V(>SIx^!_u(nB0}-vWwS5<6|zrZc)k(%k1U;0=M^1^qy)(LtpCWw zcfv7vD1U+g~KW;y^w;+QSJIZ+?kyL4M{&e zs2S{I7sHbdP4{{dL4BQWptQUtL|!l{VfAxvQ}+$Hgr+cfv%;LTyH7=M)Mk4{{{?-- z+A|fdvha)wsq=u$M=$e2W@@4);Su^HDcl+y+)61rLx8f*gvxY({33#XISKY^Wdv;z zV{iY5?qzgT%L-kAgZkVpo!Uox0Vu1&4~&b=#R@@LoJL|F+mx+Q_r~vQbCzji{zl4QSC4O~bx22Fm;U80EK=nzU#8=97Qt(m4W(;lYLm8aky+^O6JITkN zQ21y&DyQz{h$s#x4;AtFTMO!X1Bw^b_6Cg2_MXe-s8nQny2%-hBJO4p+K+{UE9MW_ zW;yJFER0c}&a(trU`ANKp`#CqhzhErLdbOm>bRDyocGw3O+TM)*Vfv;)P;0nZZTC0 zuv3kML^BC9>$0TDa%?maoawCAL=9E?;PYuYMrPWbXXsPi^G)HO}yFIivCGi}^w zF~VS<4OUF0h1D9K4s3JN3>|i)5dWUNuJnVPKfQQICw$yW`pYLx(&;8lvq*5GyI+$W z>xeNx*mK!?|32pD>OJ4V>_+NFySXUSm9Gg+!_TN@^%^SLoA1Uexcn;NbfZ($*IED>{3>C#=L|re9la?(#>4D<_0}_V&T9@HN`cl3ohcY_g~=LvAy;QZT@CQkY)Plc>WBZ z;dRWu1lrsyIX|ZSah;3G6P6|+N_nn8pS5|6)_oTCbNtwkO1&ZeZzYRPId0{J@ULZv zLJl-+4W;~>M?O|)`ZqnSj!+!v9h_yCu_Io#eVUMEkXEgLIg9_mG`NM5<%HmOVyx=r zDzQqoaSM=*9Z(K*x#szI_X1Sih0;%XfbwrkGf~^RAG#m#I8c)X>)e)0nu7diUX8 zBB4{3>;rh|ICc2+a6A5}M8szPB_sXbxGsUBUwZAW>UZh_i>0s4W?WO>=Eo6l)8*)G z=|ANz-tVdG)HqTPI`0=dQv2MJqGL8=m&1R?lVx7ZY%yHZ3p*ON&A!5s9qAs6e1` zbIQxj+sGJVolQ)VKT}dN~eJwh(8AlYW z9!ODf&sS~?WR$G^ZmrD2%S2lY?0a$(u%Ni#n7dXnptO~4MZk~9NHSC;FfC#~pVFKzxbE@|42BAv=`b(ecu zk*C)rDjwS72p22x;d1y|%g*zRGoN}wl^(T};>}v@dih(^`3~Y+OG*_fj>QY=lnTyB zCCmCRX?1R>q~N_zpT`3NeGb}v`uRq7d1~oixXkP_1wV*uNxpJsfgfQpP_ey{W}c<{E78t`ib*cncBp|KRUD89z4o zA#pfAD+evc)*fNVo3I2v#EgL2`PHk zxPWq$wv9A#is~1u?le55fedSyGm24&d8cemXXngw{L&V*)l%|jCh9+zYK3vlr*kP< zol_CFpZ8iVfBMcu+UW((g=IHnua`7(}@G5xd0h5EX7ZoDrzG;ph@Lam@_h47o5 zqDFq#DU^lKV}dao{#ek!H8)SnC`0f=az!3NfW(jT_j=|ygRH^KSM|I_qn`)KL^46O zJlX#FmXF0pj5QZoZPY+)N~nA|yfqvh)S0rVLbUxKmcLK^ra0$jGt6lXKo4U}z#35F zxD5(5#AKst1B>uRp}r6UHlKXg7O6pa(P0=L`Zkp5vo=n5yt3mO9lr^~)**~;gNPd^ zHjvt!qhSny7}(4&vvtH!+W2(HXMRl~$o*tl$ExOd!b-FDg)nTL@B3Ij;P{{+b3Qla zw|S4fE ziS3=bw;A{Q=I{d>9oeTttMXFk%v(_978NVPoSi+E)K`p!m2%Lv<}wUp^hYJ{xVay-WoVyjlxlB_O-2n@{g5K z#bwuD&`U%vJ3gB^XqRwkzh3c9hy?H1n%|0SgFHofW)A{Cq%^)1-Q=|3ka_Ye?buLP zl<7btek_n1^(J~622t;1dXz1n6G0{-tVfbxi#QmEuj>!x`5)FYUU2xx)$8u*HifMT z)7V~rnva4drgWYlv-6%eIv~6Md(qnQ1tzKrz#HwF^uhl*>q|~F{WF(-`7XvSY^Zxh zUhr9*CiACSCg9gWu4$G@+_lR6aQh6U>(_>aN#&lM_U-3mwnc|NTOZVI&jMVT*d0G3YcNhpoEepv(*o|kP zd`BCLj|%*Z8{A74L7x^iMi?Mo8RJA3+^_U4u~z%u56AZ;$!=Qh4NBFTeFV|vC1~mc z@I%js`9wmEX7b8@jxQ6$RUfZfxLG_ueK4bGZ?`2t{+drd+}71L`#8mue&Z)}F-yp3 zN=9>;(gn1=`ykZ#qFWL!cY^|5>LCG@}og=npbCL8&h4MYplB1 zK8Im_3DRd99Oy!MVv;AvrgXl~%EHjZ7QM|q9deleWC8VJ)fcB@9)$~Mf~UciJY2zc z$}zC9sg3`rI6HBp{|AilO?(UPuMw_N%V8r%5Sy6#cbA3ybmzYfuyq`vF6=Pz}Ct8&Gj$+T^v&ZYVp0N-lZ6wPnRNB|c zhvZswd*u)|$Tp#PYU&}3@;)Wn3zNN&LA$*nXkCWzEtLfn@8Xh>{jP&sVa*)ox8 zU7Do6eM|f{i_ok%c{*yl-SpG!h%!bF7~J$M`W>hD{Vcq^^=2)!&eXJE&Tq=e>RAu zfPzCtscx}nT7T`#un+59`*p|jc{l!|7l(v(Co4Pj1^lY1(sA!rI2V>y_Dz({0|d;a z2W<|@e;U5|sT=r(&y5qoZP29OZ^(;9uJZv#!I@vkvbP*B4L`!z{<&YPM&=OQ<=P`n z{NfRK120AX;cfWFqgQs@%B#?{HP;^U`Ic6xCAXz_Q`0ZxMY4^b>Kf-^>k|oiB=onU z%l1hVOA~`wLL}q4L+C;z?@0-gNeNOU7n6P1WT)1mdawSJu6faO7&`n0C;M0C)rRNZ zS@XBE#c%s(W!>7%-c(;h@V!g*I0)98lp*qX5xhO5HCh67drfSZj{`rLgM^+zzi!EF z>5lWrRN|+47h$5Ovyf?7Zh{=1g-INg7e7?PU=A(ESs4&}vZ~oB=CKBsa&m1}Y{F?A zElM8oc56H2I>M6-67^QQrddC%SjMI<1q$-xI;{iKT9@ zHD5m1*H$^VW))m&yzKR6>)c9FHZQ7~IYo#0}uY`DSQT zo2*$40$;+uXLF9e*sH%G%&iwiJ1zJD_7U!xp_YL%QspTdi1Y%F1W3nh@GKac4483M7C+L&Nt0uBe zZ}KVp6Z$%p#1UHF1WviXqn1u(d`GW5>!lSM4tY)CoX|0}hHO9MxkXX=Z@>wbSY-4` z@AGB-+K!4+e2F=_Wr4>5vMPBbZ3FzGJ-BJ&JMZji2D#}J(g{EeXqPMZngxC_Hg$Ys zn>gR5#Nan+H;?gFBOz@;$qM9CZbg6bIo6`#l2mn5&_}X&2ka z+NR;@Zrq|Byl-2Xdz<%9mUY{QnbW>pREY_OZAMf6Xz8O_#LKEqiBKkjNqoD2ZC796 zx-8)>J<;%RLOVoQR;96CE^sBhT@n83X2x#(v10WgMfde)ncEqd9jdFWV_ludc)1v4 z(G|CH_5M{$W^hi7Ot!#kTt+10u$a6RkwzMW@u=j~>G3r6o44wYB4W2XLVlKtI`81m zvs|<`#|)T#=J9WK<1!bdF;k1w47a7FH0Vu(Uhm;4;l}w2L}1_y;h8(YJ9gHG9|ry0 z-j$haP*ox)v`9?f(*oZ&-TYZsGirIFCC-J7GN1pIkUK5{&FieoDD^d-3N_2Yr_`Xf zw(DN?g)eN+9GCamC-q;b5dk3dMvTC55G;344<*LBx+mn9Qb_-{_GXCJoj8 zOR%7llWC75W@FDiBT4z*4XrxMYz`F}23{MVQRJs#7 zuf(>YGXe`Ou5;~jg5eG#4)S=rH9CIJs`}FX$YR;o#CyE!FwiXQ% zPw_s+idw8!a;Xv(A`($7UA8_L?>%#9jW!Zv^Lie>>$_yjJ#%RuKT9Mag9wznkRbkL0m zg;q=ymt{6jPMK!6926$7E|4;)} zEtYKOG5X>(LF5r9ew(d7ofV_frf9tDrSQWpUKH``l9xDla&vJAB#*wwu}a|Lv7AY; ziRvlK;ztPPy&4}qRT~cphTP!cG=BJgi?v5*UoJZ;jPt`|_jjtZ}OTV#VpHMf(q z9#3%Eo)uAy82N3OysNi)w&wdD99@I)^17qm)XmI!MqPEGHtGIaQ?T7apaaeW-X4mj z{0Drbfpyg~vA8^AhSZ+v@X{iYsmI09ui{d@!mBQA3?;o}RU%k~#bo0c?729uetUL4 zO>A0XSwH2sWeJL&xgG@jKblnK?{NB#m&iU8`f{cCT-Lr^J)dMB zm{x_~T>X1(!A!Pd{%LsM>WpGej1{k|I8m%%I?9--wyvS3`i99>!Nz9ao7RU0tEG%( zTw_s7X=~k+8#R;KYVM1cHY1S|MK)mOqVPtcdD=oSABCm$Eg^|pRY&sBXLNSiF)ekb z1onqX<5ccFqSolKhXyC~&0hYwpV|_%UjIriL1;12Sv6Q#Le5?WRA0KbG_(aVm!Q}0 zI)`T+d{@U!@IAQ_X7i$R@O0i+k=E5T(&X8JDJCk5%WB8=(?TZF`QQU) zzgH%Qo@QkXFFu`_&it*Pj#nk2ubZFDBxm(J*l$|`UGAXS!*6ppFZ}3GEd1z(Zg~0Z zCbKqduGi1}QMcyxLgqH;u!#Zx8(B`IPi#(-h9b7nl^n;6O=rlDDXfv9(+|gTBuhHg zNgM$vdY$$=|I1CBN}a#8B77!QF_?#Ct{vgV?H$~VYTj*-QTl0+`ei(9z7 zR;bSEh@&d~8mzH182^&C2<9WYL@`3@oUDN5nJeN$jeFi)E`MBmfp^pTU0B3}9O2hf zRucWTp85HMW4yvnF7Sa)`Y*hmYo9|3))D7KW~l@rT#N?Ea;9HqiZ4Pp_G?~b$#9Df z)p|}@e@!=%jtx?)WlsO8ngX=8OZ%W`V6@+D9so}T;8tMt;#rxK{_2S#@ zjz!iUHG6;cM&Wx%)jw@YQ$;lhkB%;2+g_divcF$;?b5}&7#Oi-e9zSs3zKuo(o*4xjgIHg{WRU%Ft)riG*uX*={IEInn>1WF2|S=YEeV0 z-rCqfs*u?SHAc&6zg8SON;Qynnl5g;X3n2m!tDP<%U@0ypugTBps9^7f+hH~zfd!% z{XX>T?D2u>NB^4gVR*f9VJ44)6C8mJ zNJHG9cW;2Io~o9rCZ{gU5$dL@tAnuO)^>7)z>!iS#0?>13voqe9vhH@BjrOF+y*d! z!KL7Cu)pnp35s``qwC+@gpn3<23e?^r7O%C;p7SuLW0x2(;WW-%li+oDljWI6TZ6! ze*@Ko*g)N|0U0NEI0D4;k8UFW==T36RQfCEu|F_!gf3#Sy zOgHT1AKIE=UgS^jff7p9i45+l8tEV|sr0y{DV`gST4+2M;Y6oo$33NlJdwmlGBRip zyfcLN0)`2K|Cd^>GTR`2()e+)=1cl_F4iv!-NCDD- z3?K{00rG$Xpa>`fDu61W2B-rXfF_^?XahQcE}#b(0EU1u00Arj3s;CG)D>o9ivTPE zOD6{>IP&i32m!1BE2xbt6be|uJYZJHhm(T?#1()7&_5bO9jzd4wgA+{9pV5$y(}Fd zj({~_4fB8k*2stfHh?W)>+Ng{g#$3a9&iNU02~H~0#1Mv^6m^c-^I-VYK{2w?N0>G zP-Li)8xHw|IavYD4(@J%3*h1obwj|Az+3@0zzynw9MTQu1-Lof0dR9h;s+1_!uAd; z!qW+G2Rr~zzzgsOe4wsQ$av}?ppN<=p*tQrKy2JVd`ND|K%5o-SP1eQ0Qk?K8vJSV z|7|0W20-~hcP9ssiT#5T|La!829yvG2biT4+{OV4LJlJ3b_f10O@9uk4snG3pKFKV zU-Ki&4mNOC0PgzUCHo(Ix#QeF`GP#Y00IHJJm&nMyA7`Wm&GFlx~pk_l#Tz8jprYo z|ELpxlk|_Z$Uu-0i0gyH5FP|{K0CL>B3k3h$ zC&VX+MDs775buBag!x2}+u~pCctnsJ>0dqp5#&bsmrt1Qzxsl~JjiALs~tZtGH8GM z5Uvnp5?%i|_Ms$e!md{z&Jq`Q%LRInxZX5t@S6kl-!9}9({^$~R?|Ns3h2Ompm!np Wqw+vp5q|_p_%3Ozta2Li*#85fPr0rD literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index c188d388e..884d50fc3 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2564,6 +2564,13 @@ "link": false, "type": "eq" }, + { "id": "issue10665", + "file": "pdfs/issue10665_reduced.pdf", + "md5": "4c8938c808153f6b3840e8a5eb68b804", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "issue1466", "file": "pdfs/issue1466.pdf", "md5": "8a8877432e5bb10cfd50d60488d947bb",