From 0896e183ee7f43d5f7cca5d4205557548dd86c71 Mon Sep 17 00:00:00 2001 From: Nicolas Froidure Date: Mon, 2 Jun 2025 14:29:32 +0200 Subject: [PATCH] fix(leak): fix the error cas memory leak fix #91 --- csrc/addon.cc | 3 ++- csrc/fallback.cc | 7 +++++-- jssrc/index.js | 36 ++++++++++++++++++++++-------------- jssrc/ttf2woff2.wasm | Bin 479999 -> 482522 bytes package.json | 4 ++-- src/tests.test.ts | 29 ++++++++++++++++++++++++++++- 6 files changed, 59 insertions(+), 20 deletions(-) diff --git a/csrc/addon.cc b/csrc/addon.cc index 7712b72..5590fc4 100644 --- a/csrc/addon.cc +++ b/csrc/addon.cc @@ -31,7 +31,8 @@ NAN_METHOD(convert) { reinterpret_cast(input_data), input_length, reinterpret_cast(output_data), &actual_output_length )) { - Nan::ThrowError(Nan::Error("Could not convert the given font.")); + free(output_data); + Nan::ThrowError(Nan::Error("E_CONVERT_ERROR")); return; } diff --git a/csrc/fallback.cc b/csrc/fallback.cc index 0dfe3b0..e070220 100644 --- a/csrc/fallback.cc +++ b/csrc/fallback.cc @@ -22,16 +22,19 @@ int convert(int inputDataAddress, int inputLength, int outputSizePtrAddress) { uint8_t* outputData = reinterpret_cast(calloc(outputSize, sizeof(uint8_t))); - if(!woff2::ConvertTTFToWOFF2( reinterpret_cast(inputData), inputLength, outputData, &outputSize )) { - // throw an error + outputData = reinterpret_cast(realloc(outputData, 0)); + *outputSizePtr = 0; + return reinterpret_cast(outputData); } + outputData = reinterpret_cast(realloc(outputData, outputSize)); + *outputSizePtr = outputSize; return reinterpret_cast(outputData); diff --git a/jssrc/index.js b/jssrc/index.js index 2331edd..3adcd2f 100644 --- a/jssrc/index.js +++ b/jssrc/index.js @@ -1,31 +1,39 @@ +import { YError } from 'yerror'; import theTTFToWOFF2Module from './ttf2woff2.cjs'; export default function ttf2woff2(inputContent) { // Prepare input const inputBuffer = theTTFToWOFF2Module._malloc(inputContent.length + 1); - const outputSizePtr = theTTFToWOFF2Module._malloc(4); // eslint-disable-line + const outputSizePtr = theTTFToWOFF2Module._malloc(4); let outputBufferPtr; let outputSize; let outputContent; theTTFToWOFF2Module.writeArrayToMemory(inputContent, inputBuffer); - // Run - outputBufferPtr = theTTFToWOFF2Module.convert( - inputBuffer, - inputContent.length, - outputSizePtr, - ); + try { + // Run + outputBufferPtr = theTTFToWOFF2Module.convert( + inputBuffer, + inputContent.length, + outputSizePtr, + ); - // Retrieve output - outputSize = theTTFToWOFF2Module.getValue(outputSizePtr, 'i32'); - outputContent = Buffer.alloc(outputSize); + // Retrieve output + outputSize = theTTFToWOFF2Module.getValue(outputSizePtr, 'i32'); + outputContent = Buffer.alloc(outputSize); - for (let i = 0; i < outputSize; i++) { - outputContent[i] = theTTFToWOFF2Module.getValue(outputBufferPtr + i, 'i8'); - } + for (let i = 0; i < outputSize; i++) { + outputContent[i] = theTTFToWOFF2Module.getValue(outputBufferPtr + i, 'i8'); + } + + if (outputSize === 0) { + throw new YError('E_CONVERT_ERROR'); + } - theTTFToWOFF2Module.freePtrs(outputBufferPtr, outputSizePtr); + } finally { + theTTFToWOFF2Module.freePtrs(outputBufferPtr, outputSizePtr); + } return outputContent; }; diff --git a/jssrc/ttf2woff2.wasm b/jssrc/ttf2woff2.wasm index 696c70e9f0b73b0c0a994f5047ba09f697e257bb..4fd9fa96849df758620eea7c712a535ce1feef4f 100755 GIT binary patch delta 18838 zcmc(n3zS?{neWd&b-Es1Rb8jME9p*mC)suKpuvPhhyh|CIY<&h2!WB2s1bAsNUG7H zLkL7863K|fRC=cZoq!|VwAc`nzGUHrFuX8Ud7g%c?uZnkkFYfQZPgQk? zgbXq>Ysl)_=j`YA{=WU~eRyft)F1rq)O)_>rye(Z>QDLGjaOft+H1a5pB4<5Z`Y3t zrq{k>CY^K6xtG1`oDCPBbJ1UJc<-k3HlDL-%SGpTUo(aETi*MocU^elIn@o-4c=ap zTV}l2RIR)Y)@>$Pnb$i(mX)(K2aZ2>EkV^R;JQvuNjFt>D3u~3;hR;?L5&t#=oao-bP8wZKk@=zm?~DU-tOL z`S`i7?fYzIMX=PSJq4EMAj+>QdN!?RFY30F zs>7Za{*_tid$weQg?`pfilM?J>-q(@TOBHlwUcO!y-K(35RyZ-LpYY*O0|F~BC{-5 zN{2julYmo&UQ{% zY{n5tGnH)~Eb`&?fF4xn(;-6k+irp1ZA~&T5dpAnVb^`2I7FW4QMBFGYYKvAyH~?Z zknWDl7cyOaXLeexyE&!pX7#+4oPa?GY%3su*@SNeUb9udCd`np*i?$KC-UYi-6;uA z$#y&RvbL*YY;Psy22>`)(W06ouSf0+U6!j23qCl#y^6^#uB%$`qTacu05}21s_LB6iBkC^blR8ur2{jYz`; zTk~vYIU}c7k8W#mM9RhXPk<>UTvSN$7>X|+0Tw@2}HSB|WHE?P|01+fIrn$aNClE|oBM2&< z)K8p?40NkuhJtFok`h1$?PA$7;7(Zxt)a4(@ucyRHwO~%v>`PPQis4HA%$k5V0odx z09eJ{Kv)8D{kdY#1-xfPJovr>!lto`o>MG6rER~H>=;>P9w$fe1ljJE6k^L(z-$z3 z*e~S6!x3e5>9BdJTcUs+v8`gIi}iPQEqZHbd^0MT2O7&y7zx%fG?iT6RJS9(En z5CH&BGEJo>`Fowuv%N`wsYY+&G+l#dT``mtGm~Nty&?VrENZX3MK6#8VpeQUu^?u# zLkuj{i@ihjH9a|#slT-+;&*G$K&`tC43uaBlW79eodDAv|LDm_pTAtdbSJ>L2AqT1 zhmvAuQp`bD955Mq2f7>xj9_t686YQyoDQ>EB8_D*qiU-zn&S+reis+EXxJLL?@XQ-b|`5Ve9^=o_Qn!)-b zy-RC@acZ+dm0+&t#oMrJab|S$#zmg&dB>5a9L`T3`dbf^TMq*~p!y3EV21tqE_|Y9 zy{g|C

KfU090JNXA1a0OD%htVeKoJMD=oTR3#rprHe%3wtg8T~zW@*vTRlXDiQrle*)n*1t`vjfZ+L7`<2Q~Y74(F5TXb0%5ITU@)?@go&aCmy|+2)nCV(oatXKOmnM8 z@f{W-5L_}Sp1v99njp#mnJJ5XD#XpVKxy8 z3eIBVj9I34Njo0TGa#8TYm3!N7lEGUWnp4U+3FOqx$rJ$)8LkmQ=?J7{(lFjlyX`P zH=T%erhbM!W4@C@CqC;iV#EHKa(*4QYoWi6BD>IEOMx#v(`Mv6GW8upm0GEdPrg8R zhtGB+gxHa_5W>-F^U=hJwKql5LKJf4pp}>-*=#;?Y(8?W?FM@+G*Yu?F*7aXWINl) zLBY`ZQimN*eKaaf#I7^}yV^K**BFQ1cGJf18jO^}pet2^=yvv!%V547eF1l#X)-qr zXRC2%^-p7NNzARZh#|dANJ0H;WNztCVQ$GWw@C|$Vw1V0S72^Q%q@wz^-oUktmQ?3 z7Fz*%oUNq^Y^C8(U~A^!Y;B??#lU_fGMjd6%}iu#lamgw+Bjb0Y;9q75VnF`hb@V% z=xin?D^ZN+kHS^_9y-i>SL|<&3!_y<&TSn|v?9^riK?HTAtiRLPKlYJDf3-zHfQRq zDwUSf62`QZHf^)j%H%|8wLM~Ip76CzfILcDYKwJuQ)ydbO=@HQj5Q~Z3wDdMPHiVA zYRkSvYKu^})Ykc(4sBT0+OD{yC^*=Jy{iB3DU)mC<|!`u;4hfwEnyj#Yqg}3DSmDL#obr8Oz&RA3Nov5wJ_v~g! zi$?4f{=CGI)|`;SOWfBKc!Kf&Pr*Rp>CA^v3cBXih;D-Fh&@*2~U@1oSx zxwdiq5}SUY5S;6rl+%3@4g5Cq~V}4K7oI)+Oj3sb+v8VE6Df++jeLfKmOlE?f{oXC@C2yh|Jd~&9Z-v zvECFB7x1qOz9d-5)fUmtVoN)_Fhs3LqG-F?MoD=rcIb&w>S|f#eEq|-qLwYnCN7p< zvPJd6?7p`*4G#>E;URiB)28K8(oMtT8rW!WZs`{SSez(;#U!SYqe+4!*NOn<>zB`- zZ1VN4IhBRYAgIfx+n|$)YlE&Jh#bhvKrhyRI=c-zyK$u?=>_N)n8|fBcT%5Ai6prY zK-`4&&2E-$v~vecuKu0FCI<@D>K~llTjGH@t{t1zN2eV$G$Z}cj$RT$&%VriXAd2k z{bKGJuPo+}*IB!km_ytocxj6He(@O_mI=Z>?#Lm*xVL)M;x4-X=f!8|yrQtTP&`1` z3DP9&IAHSE3eMp1joMMM9pIf&I_es{Q-+fOyZjz5VRL_vZ~I_5et$mAv$V z(~e;*#{T=Y&eviOoE=VfgD=~!Wo*;p5luArYchF<*so#oCd4%_^XxCT2e7Yg@|rFt zF%{D!lGE&PV&^M*t5}z`uw>ZgnW1ojE22Q|2|CzTMvSCYjradZ)~b~id#(AQ_|OTW zh5oQ0o-;tsS9zpCVK->4!|hDEfc+oi5(VN8P-T6F!-wQm5_K5d()a2na7$xVlBlu}2%Z-%cG;?Qr{7 zNG6c3ZGv>Afod`{ArpqJ2}4cD5R{dnZw0X^8AERyCNolT4dhA~5wsZ5Ofx1-a0i9i zW|atAPAGjb=LMdl?$(9<8D?OeuKK4I4&(@xx?VNin^9gMf^)hif(wl6O{J{zN>dSh zCr&=be*!$>4{qCr{dro5Pd+Afa=YeqDrnnwk2%JFSgp;MRE;AL<=eN?b?Jx=t!DWH z+46F@AvrTD#Mk!5v*R7VK~BB!3YV2(<*k)|JC$@IvNCm!$97pXW-KJbCOA>p>SSQ4 zq`{JYC0pp7JQ#KDClLwX4=NG|kq8e4dMyTeO$Guw)1!n1x3t*j4g)$Z72BLZpfZdE zTo2)Oq?z9&O>LontgAVIemcE}T&ZE2o6nAPI(E06mDOk+DwQ0*qB3vE&KbH`DRwH!z33WkoO81bxQ$qWRF zF6%i_q_`l;)jN-yx>%>-6_0L4he_z|#FN$JT(z(oh-gj@RP%8*e9*-EI>X!Q=N>n! z#$21CP-$MC_BbdWHY0JzW^#WF8Uoj1l;u;mDzN6HzdBDH8`dD3nG9zUu1Oz zR!LNC6VfzGTpRW;!_+VIFVpf}ni*QyN*B`Y9?MbKR(*Hj#CBEEV3-iCz_ZPZPI0(V zlRa!;mBYNoIc=2Hg#li#m;CZl;=IE>q#z#kPk@g#jKyGLy+OxjWO^ahBR_y{&?!o~a zggmuw0+eM)%esc)!x$0*g`6{}wLJ#MO7Dk_OoVio5uFm2bz*+}LsS;D*7EpIB&dSq z`c*ea_MC*Hr{+5Ho)ejohhf~RA$}zmi3l%ibf^J&>V^}IG1!#D@#$CPnMt; z%CuVZyNODYatJEr;na=i8o_)}m1=Q2fa@JvuB5~~=_prQDd-9emjEpeCFT<>N95by3W=y~- zhN#GyAuu`Wx!GFS386NEHgzcEGF(kz!Zvof1UpB!3E1V@*twRMVV4nh&Bap*g;V)R z3c2x(~IY$g#>iVIc^Ev;bKsKa!IA; zm}F!q3fS=Y=AkMRB5MjPWB0*nq}xDcn^VWF8KBJ{_~kYwxcUOHd#(*025}W4OB16IArWQTv6+jBc^$%2rEzRVfeNeHxZEE&6N@c? zrs90_YE)1^HJ)BfZXe0?!>9UX@zfK6Y^^%#nn9<0%G$(tfE7*a2nL$IE)ApF>@QaK@Iv*NJ8`28@5yYdb@3$VlA#lB;0=bB{vOp7_@{-EduM zq32-+sf3ATB_hfzB%bkeUd4-lg4ZSjs&wEZMJ)n*Fll4zwS-5YoT*+^ea+jm~D}#5DiDTKAEN@YRlS` z=NXLkrns??hJNOK@ucF#Q9?7~WYD7`8pjlOGVFugCYN{; zIqVU*>mxiO(FdGT-rW$dh~~OX*$)%N8a=610ZDq1hbyGJIuVQNQlEM`ACIFHo9Hk8 zmg8q1|M*wZY@oR9JYgxw9}ar~!i9XG`T-0bf}eryAr5cD(bZnPs|^uH0~twioO9a* zmO94{Nu-P&a-9%#o&;ftq_jQ4C!|OrO%#3=B_LIUCSxkuY%pn4H0w7l zA6`^wTVrp6jaDtzSay1%HFmMjV{FR?(RS z75H=4hN~R*>o=WLeC4bNj!M@%ljKNKEdr9SsnH2QHgPiSruQdyej>3``xCo`a*67i zIDo--s(&Ed2u>^O1JglZ0g6P`5JTBvd6IB`1SIvD^4f{b*VC-6 znH#>tweM`TPXnA=Q9@_vaBhx$E|4?2OI-i)sz@LbH*gf}&`RvWgG>-O2;IorOn5jm z?KQd{T|lG<=6EH{FlY_9JHh-W-3MG)OW-k``WPoM2%mc7@l9Ayw!!gI(gyLhSC!-W z1lDm)0SK3U*+0kmYJ8b|Iv1lVDXfMJN_IryJ2xC@s)UG9CQiBFF%@s~S0e1%>DW-B zF33Wg8i{{(jg+0^Nm4G_U$UhtC~Mls@Kn-Q{YVysD{D+q(4`3O!EB8EjoQ0o=X7Eb z#wqvOr)VsQO|vZwKQ2t-FI=TnY##?S@y*FIyG$llqUWGfW*m4?Dw#@yY>Mm`A0+X_ zcMu{)eA|R+cTSvkWzh$I2RI>`axVv6B!%BdKo!owgWLg&qaRv26U35r3#q zmMRp%u805pvFrBY%b6gx`BFf0tfGhVC=PIUO^|W@?h}g8_Q_MX=Gm_oq@liyh}Uc% zp;Cul*(K|$ejiea$xAJjKS%HtN}&_%(#lcILw67aRX`#}D6$WfF?8%8Ey%$!3YIJ| zB%C+JPh3qfrd^(6zjYwoY*JQ+trd@P9-G0&Y30H6l!09v{=zKmaYxi@0BGdhS6UN)+|4~E8?m4h<7 zJy;YwkVi`iJ|QpP$%WMblj7|@|J3grvupR#(=PET9yooD-hOh%><)^~vo@LFK@)zy ze#P3EX+EFx!rOL#VeJugsekXSzcP*8PrvPIy{ujL|LA_&J63A&j$a~`F@4)6^aMFi9t%hf>98q!lhtJoz z+phb4{l059QZegqRI&S-kDTRteRREwl^;7>#ckIeb|l5#J#Wr4X6DoXhnLQ8ZKJ7v z^|yb@%VpnLq?g@$^>XvRKWNa6|M0K~@V5W)n2MqA*HwAX51yxJT<)6>?w<0`KTGla zv$XlO*>&HK|5^?2$(eoiwa@OL>o1=D6a(vj^ZZ_3&VJ#eEWP_@FTRj-#U}sbtIR1h z-}8f`zx0&3pRr?1`jDW86rlb~T{at&m`q?l1YvY<8lN+1YW!{o;(_QS3 z{kG4{$TE5=VFp8%;6xeH_?H>x$;Rp#=0@sx-Xb8sJlj01y0G#3+2(2*sHkb3AF&NwcUL$I{YL^yHa zL2tSw6NI}yzxVA1vW@Ng3)3kmet51qmE!RAW(mcH^#pCZ8XsQI+PfMv&oi&1IQ={z z*wy&JdFBL)htD%hDgKxgC!Fuz%)8Bu#x3WYskFG~pR}LPq3T`lHZQ5Tz}!Jm*kG#W z{>G&n+{#aEFlX{+E;NH<3##TF0_wUE^ImiR7exYeU(WZiD(wL9WpD+|2}W13Td z+Yx?2dztWyyt@d%SIJkL;oS!9R$X|Ho;t#Nu_1hf#n&A4zf0ql`NE2X_ch8J&GqJ% z#_b!;CFYi~=@*+z&VoiC|Au*gf%Ut;XMV$L=RcVr3cBaNZ+^?`kA7fIl$^}`XY(5g z+tg?H2zb}n=bnMEy}OjU&x9XfBiCUUTo`5G)K`9F_Q9#Kk3VPTiKAbA-h5a(bo#%T zKk&NxrzWTQ&ia{2tNQF;n2+)L^Iz;YA6EtJQOSJ87tQxI-}ApVQsA-Zx8_)tZ~vW} zsBzvO4B9ug@Q>y!iQz|5{)hzScNrg*9s6b0m(q@H>GaRga^Eca!s@GCep*mG9s0i% zR*&}jAK~@1vOf_keLOlXfnsEmzgJK!9`KLUd?SPYshaP>Y5w2ydi8YwOjSQ){hWCD z=;8iJV@J;R_fh%4u>XkKs4HvD@4n9eTu7hyFZOrCjd{oW?}r(`IoBimCO9c)8-Rnt4{TATUXneH)$O^5`dB? z@R!Qr29Zywg)j379o%PhcuKq#eT@33mqIhI83)PVGptbY3G|XM!cUUa9V?3dco-pX zn`%c9oM?G`YD(0=Y<_bNGWOP2%)nG^b9DRBMF1%x27SKC9!vh8Z^INqDPqtjtwULG zfF@$-u)ZP&eRSs2p1dWje6jLr}a^5arl#9QB3FUFoq}y?M z?#gx(G=1$wz)Ivr)Y^n1ZAH4|F&t9ksCbQ4yZm`I z*O5R`cni*hbfnJtf6z|3fZrvi_h&L|XCnx{U#xfllj)E!)KLwF1{@@c>pr(7z}U^Q zKi3lu!9}IO9oOmPxXzf@$aOfyrol0HIq_wiyTaaK$_{)#hO*=V40Rv!Ph{v3wF7yX zzIsnlG9OS7Q&afhevgGo9}-F%)j9Dvjf_Z6VgY;qvA7j?Kz!o(GTw}r9r zmuyRfn`Cgnu;Y-G=uco0ZA6sDFK+X9ckf^iuaEHi@vTT@cthh$xBJu0Cma8GyFb%> zs`0zq{iS9{i7gl;RC8P>{h5sQS!Z{^3mh&Aa@Q9ZXnKw)XQ=&^n?zjl{vEHxlVZ9p~)9!UM9e1xkm9b~t>u)XH zL>@#V^kuUNZ)*JbUjI1LXbj!wuQQ)+Y`M>0e8H!UuW3`ETL)eNn*Lu2qBK|1a4zi@ zQnhMswvgXwx0KZaEXf!^YqyNEf9h`ksM-!wk#*KcbP=hy?o=4_j!24rsV0Yk2x)WE zsKv2A&;m{~+ajR~G;3l94RpkY6_Bo(Ptm;jd=EVptmX5_wnfii>@&OlQ-Difl=zZX zc}7huZ|Z0#nHdRhbocO^H6*gJgR1^yGc_q9)0=8f6m)H$a==a)LNs|J`a_3G3TA>> za?K)@CshY6_;Lky-haRU78scSl7H!GJCo`b4`k0V>In~II@>&u<#*;D(B&n@c@PLG zH6v_$zl37!Xv7crQz+j4fd5{KZ#>|?j^f`Q@Za3~S<*A_FbO zd7$z5qX_Y>jp=**6PWqzJxKlSjjen98O!c4INB6UfWO4&khvQ9?y{a2-Y#<@*zRpI z$Ar5|IpnoffY1TXnIg;8 zO=i|ttSJ`7dq_sHCJ7XcPe11O53rTMm`JYKN=Od`B&m(?-p0Pi{N8zYGNYpf^bhZY z!~)F8YbUg3CU2xVF1lll-pBo;%tMXkkNem5J%pj*f7;_Ruda;0`%-WCaN}Pe_a8S8 zjotGV{|NuEhlIVONcd&c;b=E2@Wfs?v8iFc=07)mLd|2Ql=mIoq+5aO+%RAFr#5Ch z=|3`bsGf~KKIw1i8t=jAJ&o;O_vg&qzYcKv07sr!;iDJdzpV`T-~GD3)_mhbbD#40 SOYs-**D*Htsr27p_5T4w3WF^G delta 16015 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 builderror.log) || (exit 0)", "jest": "NODE_OPTIONS=--experimental-vm-modules NODE_ENV=test jest", diff --git a/src/tests.test.ts b/src/tests.test.ts index b9e6125..2529aa0 100755 --- a/src/tests.test.ts +++ b/src/tests.test.ts @@ -1,5 +1,6 @@ import { describe, test, expect, jest } from '@jest/globals'; import { readFile } from 'node:fs/promises'; +import { YError } from 'yerror'; describe('ttf2woff2', () => { test('should work from the main endpoint', async () => { @@ -24,7 +25,19 @@ describe('ttf2woff2', () => { expect(outputContent).toEqual(await readFile('fixtures/iconsfont.woff2')); }); - test('should work from the emscripten endpoint', async () => { + test('should well fail from the native build', async () => { + const ttf2woff2 = (await import('bindings')).default('addon.node').convert; + const inputContent = Buffer.alloc(2 ** 32, 0xff); + + try { + ttf2woff2(inputContent); + throw new YError('E_UNEXPECTED_SUCCESS'); + } catch (err) { + expect(err).toMatchInlineSnapshot(`[Error: E_CONVERT_ERROR]`); + } + }); + + test('should work from the Emscripten endpoint', async () => { jest.setTimeout(5000); const ttf2woff2 = (await import('../jssrc/index.js')).default; @@ -35,4 +48,18 @@ describe('ttf2woff2', () => { expect(outputContent[1071]).toEqual(0); expect(outputContent).toEqual(await readFile('fixtures/iconsfont.woff2')); }); + + test('should well fail from the Emscripten build', async () => { + jest.setTimeout(5000); + + const ttf2woff2 = (await import('../jssrc/index.js')).default; + const inputContent = Buffer.alloc(512, 0xff); + + try { + ttf2woff2(inputContent); + throw new YError('E_UNEXPECTED_SUCCESS'); + } catch (err) { + expect(err).toMatchInlineSnapshot(`[YError: E_CONVERT_ERROR (): E_CONVERT_ERROR]`); + } + }); });