From 7b0b35d7f01637151909e14b53c5f29ec215a28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Leegwater=20Sim=C3=B5es?= Date: Wed, 8 May 2024 15:13:09 +0200 Subject: [PATCH] Use `(de)alloc` for `allocate` and `free_mem` This makes the allocator explicitly responsible for the memory allocated, preventing any clobbering. --- assets/dusk_wallet_core.wasm | Bin 854192 -> 853519 bytes src/ffi.rs | 25 +++++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/assets/dusk_wallet_core.wasm b/assets/dusk_wallet_core.wasm index 8577465f44ff0cc867aacd28336cd7452ed924e6..23f63b802e15a7fea2b86b254b97190bf1a140a6 100755 GIT binary patch delta 49968 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 delta 49799 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

CoyKx2-{Eu95VN&XL^US zIo0Gk@vplX96z%89+P#tnmme@y8Ua&xup0aYsssiTlsU?DKYIZECAW~0U7rzKe6t5P=3sRi!BUo zD?-C*tg#Ib%O_kLQp7xhyd1dk7Gl6!Ydg#1NZB{-BGav~u3co9u?Ma3UFGf|gPrRp zzYg5}9+k^c9n*WrqlpQn9+MBF(ACGN@vPG0@8XMJSBgJ)V00k>cp-SedHGb+a*&j?KcF&&}&55giN^?>SPz6mR}(fo{=jF zNzSApk|kV>8j_c8FSe|;&!PdSVQ)V<7QxAWGL}Qu{r%;8Wq+R+avcO?0DZpnd3hRi zc9R$6v}j=?>w#;fm?P+78oN4De!%^He3V=VH_3SV%27~}zp@WU$(191C22{6yQCQ2 zi?u(9QqiO3#{N>Hp^F`CXGhB~V~%-pjQl2oh_Q0*)T>mu7+f5Eg10c}`xw62#3G>~ zV`DMwXIlfu$tLzw*t!YwmB_#)EwA?g+cXjKbbw8nBtPragbQ_PY~vU?dfIHc8LAqS zBX97YZC&V!Sp-RR*$P3e8S?uOqTgo7L*X9x@=W;^w9&da8?qoQ zWqs$!p9(8j-MR8UVHwls$%};L*2;NU|3Ok##3 zGX;F!#2$oq7rVSvo)|PW+qlBBZQX*|ZxK83mRvq=GoP-YHF?p!xM}I}ZezY>^4Kar zQkK}v{b%mr8#9!c&Nr;wLcr<0$PO%%anpchU>;%{mdW8!>HZmO2kj(|T@H&uVbN>l z6n7%IPIH!GHCrJ^kV0v_TJAJ`yHFZxf07>D@Os_q_y$^>QM*VW30rxd{zRs?)I!?&vtxPTKTI>l!FFy z5yM<`A6sq72W=XjW~0i=kIFdXcc?#hw-UofZr~G9P|YmAr4nzQ+aMpHDQVjl`PjX; znR>vBz?>2ixp}ss;ekC`8SOo29ez)a_fNKb>WM4}o_fejpHvT~o}LB4Q;(gI=T1Ep zAFsDfY*WM)$qZX{+jRA@AI&3eW`D*QxJ5dY99pE$H#shL& zsB$apOF2>qn))f*p4d2McaJ%T-9wn*x zMGjHSK__^}k7Pd#HcBeIwXD=wIW6f=8_wDv!hDZIg~Rf01mY37udR6ae(e~wc zHuMM#j$hfPBl3Odi{Pcni%giIC$Lt9Agk+9c|LB8Tt6yz2GqmH&H-ShDmu$u;My8cJoBe^SPM5@wy0E&t3(OM6%i*lZcfhMtmNN^qrdhC&&aWk(v> ze5`%K3RT+2%NDVZ*XVnBy6`&N|GhjLda~bXu6liEVVZHqV1U(EQIf{lJIW7e8RK zhYHKNA~&{{o|F4Ro~_s)WkH4#dG)e<7klJqnO5H0f0nadxa?mr1G$Fiyx(AYhyTiz z911)}N-hBfpxXx61uC(IsY)b{JQdA)^fxj_wpf6Sr6GiR%b+T2-8Cqfask!!C)$WM z3lCZsuFI*BxCjyzp-e*+xPhHwZH-WBks((9fAbo4Ix8QiVB3|86^y~0I3dTmy+hG_C(PasBm{d|^%Uh8xa>_;xS0y;n|4BfD51Otc05&5d6YW!qf*LI z5~{^%3bv}PD``q?vRA8?QC>vu;xdX?78Y3VW+(@AjIePvl+wU~5k{K=-_}qpP>6w0 zjeT}Xj$|*_RFc?FHI=Zy9Wy@U_QsHz5m8GC47nnkJs^}%0DQ=?EwvN_3ghEi$~AwJ zVdN9nIi4aT)4PZ2Ysm8JC<&}u9fh_K8q`r5h_8=eX=mgHl#vFaKCh$Dc7q=_{IY!) z4~$;K3hOGg=b+b9$UZ7pPw5euLqIF)D~t*ZPBy=uf>jN(>M8UB#RXot3)67(8)w9x6hJvjq!)39_T}q)1@gimZ zD%W5?no2Vpt34Dg48_v4$^e?~?8s&LIrj10N+N6BQlSMlFg0eouE;UgM=ceyCal@_ zD>47<=wt_4D=jfNOSDn^n@U~VD63NJ%YJy{#mm3MWQmvd@ zqu0!NHPb;$<#S#&Y17!H?#Bm|$|#c30X>|{?(CqLb=;CJtr4gwGEjsjI@}fks;2sGH^VgoL^FfL)w+`Va< zrusBoKIX@V86B0hW;Q<6q@tSBBm&P&({X-HE#i4MAr)|K*G9_5bfi{Vt2;v09j3;j zY0-2bZu1xsAMURs%Cb8VQ(4+mO0w1MVdXL6Y(ZzG8-kLLaBki6h|(3Yg^wtAAvpaA zZ+Y=9P!N#%E=pSjW>ZuGy@JUZ)3W9Er5dv$} zW6Dh0NkzpRXjX5irCjz(ALSZ?L75zAL8elL?6JMiD5*YYqSUZ4W3!9oBRz^ZVxRv- zJgd-|S;n)<4y+z8JgaO#Y7hA#IdWp81A?MZuZK$Yi*Lq+{rm3v3H zRXT;Jwg8IqZ00B>(=A!1yma6a@n>7a``!{xZ4uQ^CP-&~uUYN@U zZ&gy`?2{%e6tI?yz*$?kebTj6saIhxHG(E+`)tc6`H$gX7dhZOjYSnG^?>l60%a`F z?_%vF|=on!{u-_pvflL2AKHxk+%Bbb;`g>i30h>c z*#J7(YC0fYf!6N1i`yt!yA*P+D!*H)6L7B5O*$?Vuwnf@>%UupbCvb=Zl$=uc6=iz zKWVSvZdwr9iMa6YF=uQT0Zt0`HW?`;ehogKQmON}w&F?e@FXKRX$w!%(Z!j2mDSiY zOWg-K!^2i~@Z~(*~$(m_DBVD6;F-wmxqUrV6U{X+$LsVTXG88J?wz;SSlY9ksg>% zViivWOaZ|hzL_W$0VsTd0e+TM`T~49%f^3!v3ipI@P$%IjaC-|oi);}Bak$jCpiqVdwE<)QoP5<-R?wh z_6YXIL8V-=&$&3lK^0OhVFCQ{LC7;+vOCDF*vzk$Z*kSV^*7Lb)7biNlxH!(${$j; z0_6Kcm{xMF`iGV1L`3hqs8qAPJCe<8A+0!V%i*LAi(6~rMa&BTJ$^~Km%>WFDZ`5k z^R0YC?HYl2WW2hE7Hmfn)s_!G3`T;Lf@$0fSGgI>CX(pV4m%Nw_mtpFXD52Rv+N|g z{KNMi1@pDcDjrD406O{;ptskxqVGY(G8$V|uiEidpHdmu%f4sy?=s8wMwB&Mogqx8?IYL&8XX&XHp zbbfLW_?+b$c405FaXZz~*3J@YPpQ^whaMleZ!X0HEho@YPBIjPWC8;go!|g{V!1II zdlXiWG&MyMmax~#sDp(!+3#i4H^Bc1Wz~leJ5g4B1aELOEvH5b!kbp>@@hY^o?FXR ztgR$-2E6rxs^N=F-Bg~ZXA~ryd=U&Fz4_KJ71Soc!fIAh4Om!Lq77ciw_;ots~LFyiA-?25Kux7@2jo83?f?9QCFaoFV|6*Ajqq$ z#yi-3skKwd zN!;%HNE3tt7A^6<%>@7p8A>CEMHd}4(`$0i^11cYB;jpqeLXdq2GagJ)SeE}2wF8z zld@dIzT$Po(W*@bp~N$IK`8&%D2#F2mB-&{e>B-S)jGcea4YNl2!-;_%_>4OZh2TiQ9 zc?Z-86o_cn_u9iCG>gn6p6iqQdRG(f7HnK^HC$M2vEJ%TQdc!H)o$dpF=>pNCah(v z$EeHj#zxn%Dm(?}u-C?`{am5MCJ#TV-;4dluh@<8YDIgk#?LNo4!9uhVQ0$;Dt1Jz zDHBv2w{m;FkND1TW{yx25rr-2n8UVtOIiCS@~mJ>8J1?-pe%0W-ejS+56!=)>5p8j zXa|$D;6*zIE#qjp*)*#l)7E4dJl=yGgwpb8n5a|KO<=?JDQZdb4?R9j#nHe%c51qs z5y6EGye}Xpj%22m2ry_b#sKU$Y_@&HS~0csZ5U*OxD1-W)JNRYbgCS=W;Wajt>2k? zuTaKT=%5LV_i!&GHw8`c)bPObaK81_Om(1O&bONc9MGkz_psCCLb9y9ZYjcphpXVN zILJprj@Mh_Bj3V!K zmOe+_RGrgGKHD}@dM)9aLkQk=0$Fxrkc*=t6{RBQVlMoe4W0{qlFQg!wT<0D$#A~Q zswZX3(3GRGT>)ZHS0SC@$@A1ZglnwHJT(S}y?Am1vq=$Wu`N=P zIT|sZ=Do~1=Bd-;cXE;>?7(N5qo++AkcD=n+lyB71!_GZ(r!6P6hwiIT!@)&F8gqyS`IsK=N78(B3QUc zJzO&|PO|^Gaq>A^y;x03bcYMBPms|C^2v+wi+E|9jHsnho9kHnx6~xoZmCLVtq(25EIONIFI7t+CvT}bLin7OdrPfo z!=(Xa;9F|>x-KPqF*6$`yi9FE46_IcnzVzZn4+Vo-N`Y_ z)VqPc^D=c5g5%3n+NZs-Os$);j!Okt5}StQ0z$738^koN!j*Wr+7}PZZeFh9i8Xd@ zxtff^i7V8x2o|n@UYO0!uK=obEPN%D_&T<^hgTB^Ya;j-^2LfA?TJc&MX-G|b*c{=WG&eNu=)Fic-Nw1l*{co#{!NurRY88-y z9O7cnRVr;=PF$rX2=B5tk=MYbjabMr`c*QqP$W<30EqzLiC6}MuaWs`8Q|WUuf~PJ zjmG6{`+Pj-`7V1t9}^7Ey~hDk$STWazSU}7BS{;s{?My(%O z@XIx5#JlYB8W@FhtX*r>Ndo4SV#y_L7-LTcze@Y{hS6i!JprG+JM; z))dyWhU-CHuJ!18l)|(jY=qvy6Mh>}{TjA;qxxhRpG2TgL29K<>f^%uY|QxT~k%rPQ->Hm0Ny~|lcL1j=G zf7XK^r~_QSdN{mW=<5&E=iFNZv``?$2xJbMC`RiR*RrHl#jOyMpU^_cABP}9+58XH z*hd^X(VKQ7fKf65cS{}ikhbj{4q;<*4#MmPxmc+D&#c%-YK_`93!V2b{bFC>u?hc+ zH59x0k@_lZkU<}-cZmqMe4?(TUhn&vn&di=*~?v0muNObY1U`zmSQ*6$l88{5yaPJ z3nT6MgF1y6&~TS}ch(n99}C{2?iZM!E(JwFE#xndU5L066wk&2Qgz~j_e+jOqziC@ z_g3ry#2jT73^Ce*bFu%cc>Yy1SvS%1*Lci^X`0jw>J{S4;U(>~+9{Q54<=1$iw8P+Sd0fpNvNf>Go-X(3cNX*LxP?+>Qp zHYi97-P{nG83RxdfrHg)c-j3fd z?OgN2nO}c_E4vrhA`Ym%fM&)4HPyLH0gl}c4ciA0K>m0@eJ9MVu*k#aA5deET=0cT zw=52S!GW%Pq24fDARmWGb)(p9zJ*3s{VOa3=2-WBrQT15*!06tWOLYEN7OwCVvnlF z5L`TpMNBU1eN24~vT*X4+7&_bLKPd$Y($}oYfkK=LiMn)m@PbxNo_Iv;yBin2dtIf zs@Leb{pF`ry7VM`ufBxLm%mr5BUtvmx*K^fpH|OBA0VwHVlBa$rQ>eKi)U0(tZFZm z?CmJ?^rSIZUd*!%d}u)o3)|Ya_o%#ous6@D4Y3~o_Nwe*a8smsDEFNSLII^9qK-_?$;vpzV zv{BqaVg9Vf_>Uh*j0uG;o_&7ivX%2Q@644y^RE5Gj-C2heG;8<|1UhR&o63|SdbZR*`3p<7j{`@OyVlB6J(i={` zH=XmqsT!88n~_MDv@l}MUBPaWTaZ{!1%p{n!=KWE@$7Zd0xAIud7HExn>0?9Q){*Z z9gH4wOWORw zd%5o)YOj(mgJAJ-$k2{uKmEZaA^a*Yk#SXh2U2pxj{SaBO>vY5n8dO#sS;b>rW}*DfsJ8DdZ{mODSY~VciayqT4S4AQ~}zzV#O?;3@d) zPbuUn`0Gz0!3G|fzAn*uJOzLKDFr+Qe|btORbR-H@Yez2B+-r9t?^pTtPxxni}p46 z(-`}1g3XY<*e-HYNNxplJ+_qG6ubF(c;nkmDdI4r;hpQI|OA72EJ-(Cy3H>KBXAh)B4ykXN5i^(lT-{*T}) zHv{Ki(j=t*B~7(c|FZmX_HwG0(uxz!_eWrM z^SS?H4(*l(rOx2K)0dr8Yf=gARBQ3na2EcgQ5Wjy|Cg7G$M-VG5-#J^s43GIkeD9%j}+ zQyAdo-w3QS!!&{Ll^d>Qma_5D;Ww-fKJR+%B)k|8?-h1@vL44i7_JTL<<<;10ozvv zd`rYhL`h8E3#hg<#YO`VvSS=<&WSrE$xf0B$FuCRppLB^p*00@b4O~u;$2FpN-9c< z&3lIR8L8F&2O!C#v^u4KaCqeu_qy>y58*3-De;5#+$du150*AY8>I+m*rbVCsc5%e zfcQ%KN_fv$TPJG8WnmZl{0-PLS6S03S|9NGttnaq+L1ajReLal^EVBTD{<48UOw^` zaRTVmPURbQR*z{~TOrQ&62Cd`gXvl`>T_j=)&(K!Ia5nWvdO`=9mv7P8~)lnJHsX; z8_;jf)KnGF`SWffKGl~3;tS_#$wHjlD7*ZQoH1DFow16|*B%n%U3C<7d*ljX|>(`K9B-%$$NpdU8J>v*v?(VRn(?Mn)`BrL0h7}Fldp` zmkWMbq&?uQvJLQrMK94}9P1Zn3Qm!bmlIglVy>QMFV;>ODJ zXM)yoJY)3vPfo9&H0=+25%$V5?O8DG%rfmxAR3y_>8QGq2ls76pUh#|%e6HBYJ%t| zmHX!9N#Bn-y7u5cdlO^pa?aPo%Xz`eD1m~>D>Qd!MC3cSSWVrQF23JEnW41xUlCj} zSdR7F%@wag9jI#O3aZ#Ty+TVA(HvowwhAL*^(yTN#NzX{%s*?~fqX5kyvsUj9Ia|X z8|SRa(39<#Yc!2*v)Ob1YTn8l8#x83n|N@?CeDEmkQYD;(*GQ-;G$j4i&~A=Xt)*e zD;w|*$27qX-a_DCe9@YicyaEh+=ZVM?SG%IQrU4E@|qnatqUqZi)7+&Xo2C{ zQQ{^$ul-i73}X5VMqBpbR;@1j^XgXZj`H?vNwkrbM-e z@;7+<6@DnMm@`OJy%RW`6XPbt7&h-?t@WKw29`EtSB!DM@D1{EoER1nc0MgIT=cG=t)pkrcr6)dV>kn{){47HD zoiHK7+l0~r8$^pH?*v-0}t&_jkWBjip z72Sq*?jHh7oK5V)r(F3SM=7xXJ>c;3JwKR2uCC$9;gA;0_r13vmo6gTOfEJWg81IB z9)C9K>3V$Cvh}o%31|9FuI)?M!7)4Qk9x-QAgzCW4miF(U(ghuA$XRyix+6Ji>url z^^F1~7Tm!h58uHdtDohN19o%BiMt8XYTLlTFZ;}4T^n-HRp&TN(H;&Hxt9lfc%F5( zq45ZT&fmxD*s_mjW;N!>bM2t$N1d=%|6E%_po5!otb2J^NHZFZ^E!KG-NK~O^Wd<&g4E(0w32(L@{J*cicM{*%K9Odl1_o&tn zMK;*6)qil1-F8syn3n21b!Bhf&)Rk4vxQqe$WG?%^j+1Lq3BP?IHK@EjyA&%(ynnt zO|J2-8&as92jtVoIppZ$9CGM&4l>scj`2L}kKi1lLkOIkS}ry{V#C42)- zTsP^Pt_&DRYu?3|v|*w?${~nVzl=`A1(wU&4lLv1uV@iM%ver^eavX@{f@Qj{H`?- z-Jg#}7RDrY(X_y0U?}H+T@3^tKSG533(p@qP1& zqumuR*^XF#ddIU$QF?ty+!IlH(^NuAYkQmLq<5iqJA%hXRGR8NC>yp z)Srt&SliUMMj*V{TK|aBH?`Mg5mgj)(7!@3<3ar;q~=rlr$ z{$@wI>f}&;t*c&FSj}p8)7xhGsobYhX+d;odhW@(S=^iEUVNA>Y3F0Di(H4~uucprf1 zU`HO+n`038y6dfNPB`+NE;#MrqY6em{rKw&HmN&UFqwVST`yl|r9*2rT;!=GfmY@5 z&2WxCx`&<^zv?DPr|zab^tdcPD{Sg*WI*5zEkv?^YZbSoaz@@B2W>Qkl1Q(`7003_ zBqLj5-FxWC@Q!lZ2V%^FZ$L$cz!h@1RMxnsuDL#V=nmd;QdYs07084$_0ixohey0e zg2>`W7`JZ#KeP(L8(JGX)>BVp&-BovI8oL8oV|Tj1^h9HpsHB)o?K?yKc*)>6w3Wz z!pTkoDZJBx*_-c*EXRl35E30YSKNTRoL=D0E$2~F8Mh{)heSTW3@U5)8bi7A(Kn&a z(}}C`?4`%`$a`;UEDZHqP+@>@5{YQHQd9vrY7o{Byae0zxSouWbNX@p11wKhKA|Ti za^!r9M_C$XjwWJ9pMd&a%aWed+td!832qua3fyi3HwUZs%q0qgd zBS~V%d+TxDLcGetm4PFwEUK5D5biI9y{5w6;KMz=^kVJ{ZZ0m=l@8x`8tKpWf^_`Y zTi46G_*_ogz`?^nqWP8`@2kh9X7eXu0^NcRL5gDI%>AWD%b0;Z`Cs3E1 z8a(`5Sa3do=Ydc>IG_!|Lx-_$Iq=C5J3A$mbmAheQ&F4Wdy3lJSJ!znY@%Jls2L7x zZqp1`MqTJUg*SuU-&;4_hot=ExF?Q;r(0+<;87gXjBJb^f4Q5Q5iI?7pV-ZCX~5X} zt3C;8jH7YgirhiTnt?!)fr#67hpSB)wc{of{^9X9^2*p_9_wcC5S94HtWC9@!XABE zPb}ebgE}P?5<`z#lak?9>oyahx9D3GHEb#0oT*0!I>158M=|<4H`DI#C^jTh*Zvf& z5MXuPHjo@ZY(o?VZ^vzj$d2GdRJF^XFK^TK?1<3RLS81Bjqe*QIX2;>PPm{FuX@;% zzn_O8cxb=Qt`#Ligde>S0_m2wRa?*)kK__eZFOo5VmML@oHr|Zzr}~r0>x?5IUaP< zfGSqPVR zOKU{z4hHFD>*;6p-L#r(*q1@P#-PS8_#1)$Lq6@w`D3%>^=dOGZ2a8e8 z#YfXes$?#k&GZhS^8#wrL zYdU@;2fs@YNM~hc>H~pw#!USqDCzFA^eu>$n2k{}(`q+cA0Z(6Wv*VanO!B-mM*so zt&gfoS8h#AOjiSmtl1nr-d6QEoqRoKLU!JbmD>+`0<>`2mFAb`T{wCD+LVuGX5Eyf zHveht)KjyTuXrP<0aVDuqg*%+lbR31PZ_myN}-agOU~VxG;~w$tA0eOb}N+TlX9ki zKXll)Uj|pgF3izmQaHo_XM58|Oq+;U9xP#{=IY-(JcH9I@=ikPOeb1E%NDPj2~(OD zG1$X!Q?mJH2v2v*@MXFSH zJln2gS4cLepuo=N$gc%w+XQCwx{2_atjc^Y@Wbcp9U+9@*s&T5^al_dzCdqQ>-je}DNxlv&xZeZWn}q(xtIQV^6HWwz3(6Cv;fpENA<_=30OD*tA$VQ zWZ&GHlo*=i9!jy?V|pfTsB4A#*RUXu7wWFd1$=TaLnh#Kn*SgZt-s-?L+*%_R?L55 zE_44PO2bd&&?Up;y6e4&JLLeULms+{MIg>WH$WQOo-Fnc9#K}nLq+DkK9m-4?6B{n zQ=09evKlBr?}x|rCXTNfDuWdRh~_tL>=}FZ#*HsZ+9%uJa`U+n0>^QY|5O_Re)aX+ zvrhbaX2NFy$3>ZA2ssVcz9yD^=i8DivZ7&er1fd zH+hbHR>sHzvQ}k{nnLkqyfFEEqPV@6JgFR9)#k7t${8VUR6+$K#_ws4^#pf8-nw{d z?w+F0H=VFO&6}0yu1Vd>b9bYc%Nw15XrCQBZ|8+&7^!t#pKc7&xWQ0sB ztZN1+$1VB{j{Y(*`CXl|+3Na6te-yeslF94Yg>Vr>|4QD3_Q^ld8|rBPV{{UoTmb? z`n_#=KBI$En4)hbF0Z2T8IV3*$$v)*$Np^ok9ur5x4BsM@`9mUbFk(x;SA1$=dfeI zfZ&fxMiGK@m4mvWz{98;{J!RJ2q8j3@iDUsN6@W`LEc`2su*QdXJ6)jU_;547x)!& z=R*I+i)~v0KYqCxe?rs4H?bFY;8Ny)4Fdbne+W z{=kl)1IN*YD%q%exssiDuaV*}5?!dp`y*8mar7=oVri`m(ptiOoQM+l8H*kDWWOy# z^oA}kj@`#;x@reWt%69~c3mf`A85r@Y03M8NNDz*7Vl?_;|uF&46U(l!~M_K`-Vg45`_I2MX_8k_uJ zkc&TgV-t8_y@^vvcsvkza2hF`Xg7@=4@OboWCfO|Xn~W)m#2Js!XgG$;RST3JvBN8 zQIQ95YDjR6@-~*m1kSbvsDuWVr6#5(f?)2JJc-#bHc_xY@GKuFdufsErdA@%oE)PuI|hc?6!lmoe7Vn zJz{X*@QPi6D9RT?DIyEwHWX!d;RxrTC@^j4VsMx7)NY)>`rQooaU3Fcmb6dLDeFKbAI;Whl4H#gQ48+&~ zV=$_Zd(P-0SZu&^Mz4J_ebMNT;Mj{i_S#E4 zNE&3&>2b~=gMRxv@@1a5>}3v_@`~{g5}&h!PhK&;MQp{Z2K_<<|K-$@uNjT`@6Pmp z%_yIAohrWFFAB2!*Nm$8p~7RY8MpbN!tt}|KEoJNWAuUv-ftPpDhxLAP|2r(UkW@j z*hq=}l{XDPF;UFp<3CR*cz?B0hZtYe6@y>1j0X|4$~G-QEW(p)y?En~O%)d;q_oA`wI#R#^Q$@Duw_(j%|R_)nFe>&pF51_=d4RegQ zg|ArEMMeoWVy>|k-*?P2h5%Eyg+{Vuz=`dPdB!>t|o#$@N)I`FnJ zRuU#z-PaghWZ^Q~^saGA_?|7W3=_c#%jk@t$$I0w@V!-egK?iIT((}?WIQh7b%R4& zjAw=7KTz+bDfD2p0GC=3&mVNzYNScRXf}AeaiZ90K9k|6t>AqX<{i!Yzi*rFZ4LMUQ;IN#jsMX2I_9(^e}Z{_F8P1U-qY5gk7(LEVa@*7ctI3SThX5y zQG#%q`93p#6;4?RJBwo*w2m9K^YkM zPDa7!MxA2AIaRb=U1HLry8^DuU^dX}xbQGc) zR`)|jw2CK-1{{Y)J<=L^+{hC3le{tK1o|1wSe7#vKXhL91Ulm+n|i`%i-5+lb>)Qd zos8dgIC92_D=xgwe)+?ghhWN8Acs?C0Y@je#GM*lP1XIIqCtWX|B3ns*AjpoXOiQ&^P7gGyT1+hD{uTG*Wk zO6p;E#yD3Ya6SP~MUR`fhW8 zKqyEJH?!^oTV;MpYa9H(r-vf+M{R_5)Q`}|niyePs-22TGQ>OqKRYLzSE++=Jmbx^ zdKzK)ah_c3kEpO(q@AjH!}cR8MTd>j5ROX>drCtye<>Aq2ZAcTud z9Z?V$c2Gfr?4m65-S?D`Gk>^UReh_vyQ;tH1Kh4&mIlL$)hkySyq7Nh%Ez$Qcg0t} z3&Z%+lQbW}FzSN0O~LE{`%%-J|GTwR(0G%|R^@ z|0o(Rg>&#J8pL@~G}A0X_Jc7u2fi8wTeD8lG$~RQFEfkkBbzX=UMU;G4e*vJWY!^E`hr9$I)bt>g$GRS|?rP!e}y}xa8Gy7_Q+Q=6ade zpCb<`R%MM7aaf1Z=czvrI!}G2E9`!rT&1hL{5(w%*W_>5JDTS6_ZNxSItJFS%N)6u zCi2%H#0}Y-t7GVWj*cN0DW0ohXs$?*XQ)g&UU7kJM4~+1L|wZ;gQO%bzCdG9C(`C3 zJdw-?F4CN?DYC!OS$bz)9!tGAJBtQzL@d3_0S`#WTeHZ#r<1dri|;$!%pM0OE8@dV@BqumuY~=kmspXANIeD>1J~3WeOHqaxkY~rf=E( z44HF7ELn8DCGRuZcW_hfzr}WO^tF`DN8)HCZUoJXBM)&$K81>1w2Mz%p}|rPXI!CE zNWec_r5(5(|IKUUk8%W|*Jv_o3*ceLme;92%I%D}PGiLb*^wQtQ(xYSAL5}r26cw1 zAIDv%!6N^);?*~xxIm4KaeVg%JX>gL4~s{;h{wbuW{P=xJRKD!@?qW?Pn%R{50Fav zVFCq+GC6*KkueWHb*nnb-7TMI3Ba2Dl z*jv;`{HOpeUa_pDja-_J~c&3GR_i0X*$C{_TCUGEwbkg_>Icr7awA7gOJ! zjossS2iv^;HhJQhVV&2B>m&Wd`g@pcNDk1b?GE9_KxGL4#gz}0LR02#;OeLxfQo-d zKRYRaZ{|>-w4DvPG+x@lVY%2>JJoTWKt6}rpQWEwJKK>MBl6H?57*?OOQ5RbLn%mo zeF%Hq#mJ`Tkp<71hpBeYB@cdn53$4C^*)UddzHC=1S|jRKJ^p(lutSW$X&Bv;hII{ z+SAqB$J<5kxWL8P(M9j%>*^V-MDV(Yw40M2z)c~_9+k3Yvxfj;+*9$8&WeM|QdQF+ zo|8{AM5waE)FnQj{LBt13$Ow%?i^N%NYv*drV|P<%*aDnsI6#8VH{jQ%aH?gg|r0l zk7@M^x(W0PE`%SBD3dw{{stEm0?mI#+1u9}?+qSWgb4YMx@_uO=Def`bNjF2(W%SP zA{uCRRQXIDh`!T6YKzDL3FGZz8ZVChf2bV)Q>dKatYSdjN%mGJ@MbJwBs4FD&`S*k^c{i(0#$BEAp1*cfjFZ~?+8p&tg^lg z`p+s;I`Ka*gEONQq_d8&jw%B>pHtjT69yU#LNYNgCwEPZ!q&5BE#D}|GGE}Fa)ixA z9$!JD_~S=lU1IM?v<7M9{v$XumS;bvHJUh6Ah39XByr^xF+(M;z9JZebj_rv1Z^Hy zL8Ey@1-Lgn@H^r974sq(#b zkQb|RZ>fZ-o>lS+|f-LDbRVby>T_G*AfA1n4j4Y0Dm0jTvv z@c_}AQyXZgs8GfmCAvm>UsNh1jl}Fm8VHPsk|``TVTfgo^cG+q3_G@O!WU!JimOq_ z!X|91XNsrswF6Bw0=S>nL|!?1%#%eSWvfSFdKPpGZw6g{hR4a zAo%lUELbx;ynwe~@OLlBM|#OcFK8ja8V^t2_7ZW}s+3Q=euQzaLD~%REYR9O|UR>LX^V>%5*GBWiCha25 zZ=MSJx zKv$i&6cD&i=PYdx%+QSn{C1OcW5rJGN2Wn|Njf*NOFOlL>cMf6&K8JVCZYRow$bRu z0+GEmpaMBWqgy0`v=chIci|yIXDd)TsuSxAp|cZvwUaur&IsLm_!UFG&`p!}<7NZh z$YH@+?K0nGD}7gm7#lu*YYu4542ET^m#$jubWq#HU|72Hixp^xvR={I@KIT3B^}~8 fS?9(hR7M{~*Bht`p=;M)OgfhN9pUAQ?%@9bV?#VF diff --git a/src/ffi.rs b/src/ffi.rs index 1f92b32..3aa61c2 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -6,7 +6,10 @@ //! FFI bindings exposed to WASM module. -use alloc::{vec, vec::Vec}; +use alloc::{ + alloc::{alloc, dealloc, Layout}, + vec::Vec, +}; use core::mem; use dusk_bytes::Serializable; @@ -15,22 +18,28 @@ use sha2::{Digest, Sha512}; use crate::{key, tx, types, utils, MAX_KEY, MAX_LEN}; +/// The alignment of the memory allocated by the FFI. +/// +/// This is 1 because we're not allocating any complex data structures, and +/// just interacting with the memory directly. +const ALIGNMENT: usize = 1; + /// Allocates a buffer of `len` bytes on the WASM memory. #[no_mangle] pub fn allocate(len: i32) -> i32 { - let bytes = vec![0u8; len as usize]; - let ptr = bytes.as_ptr(); - mem::forget(bytes); - ptr as i32 + unsafe { + let layout = Layout::from_size_align_unchecked(len as usize, ALIGNMENT); + let ptr = alloc(layout); + ptr as _ + } } /// Frees a previously allocated buffer on the WASM memory. #[no_mangle] pub fn free_mem(ptr: i32, len: i32) { - let ptr = ptr as *mut u8; - let len = len as usize; unsafe { - Vec::from_raw_parts(ptr, len, len); + let layout = Layout::from_size_align_unchecked(len as usize, ALIGNMENT); + dealloc(ptr as _, layout); } }