From 27f72f0deb12ac99868da28d77c8b60f37d8d893 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 24 Jan 2023 16:08:32 -0800 Subject: [PATCH] [instancer] avoid double free for compiled glyph bytes also increase the HB_GLYF_MAX_POINTS limit to 20000 cause the test file has a .notdef glyph which is a composite glyph and has 10176 points after get_points() call --- src/OT/glyf/glyf.hh | 4 +++- src/hb-limits.hh | 2 +- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...ain-all-codepoint.wght=100,ELGR=1,ELSH=2.ttf | Bin 0 -> 2696 bytes test/subset/data/fonts/Handjet.ttf | Bin 0 -> 58944 bytes .../data/tests/instance_no_double_free.tests | 11 +++++++++++ test/subset/meson.build | 1 + 8 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 test/subset/data/expected/instance_no_double_free/Handjet.notdef-outline.retain-all-codepoint.wght=100,ELGR=1,ELSH=2.ttf create mode 100644 test/subset/data/fonts/Handjet.ttf create mode 100644 test/subset/data/tests/instance_no_double_free.tests diff --git a/src/OT/glyf/glyf.hh b/src/OT/glyf/glyf.hh index 84d57ae3a..60a253b3c 100644 --- a/src/OT/glyf/glyf.hh +++ b/src/OT/glyf/glyf.hh @@ -98,7 +98,9 @@ struct glyf use_short_loca = max_offset < 0x1FFFF; } - glyf_prime->serialize (c->serializer, glyphs.writer (), use_short_loca, c->plan, font); + if (!glyf_prime->serialize (c->serializer, glyphs.writer (), use_short_loca, c->plan, font)) + return false; + if (!use_short_loca) { padded_offsets = + hb_iter (glyphs) diff --git a/src/hb-limits.hh b/src/hb-limits.hh index 192b77416..0f60e9e21 100644 --- a/src/hb-limits.hh +++ b/src/hb-limits.hh @@ -90,7 +90,7 @@ #ifndef HB_GLYF_MAX_POINTS -#define HB_GLYF_MAX_POINTS 10000 +#define HB_GLYF_MAX_POINTS 20000 #endif #ifndef HB_GLYF_MAX_EDGE_COUNT diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index e6d2325ee..736a07f49 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -60,6 +60,7 @@ EXTRA_DIST += \ expected/instance_feature_variations \ expected/instantiate_glyf \ expected/pin_all_at_default \ + expected/instance_no_double_free \ fonts \ profiles \ $(NULL) diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 845a77e73..6681006da 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -51,6 +51,7 @@ TESTS = \ tests/instance_feature_variations.tests \ tests/instantiate_glyf.tests \ tests/pin_all_at_default.tests \ + tests/instance_no_double_free.tests \ $(NULL) # TODO: re-enable once colrv1 subsetting is stabilized. diff --git a/test/subset/data/expected/instance_no_double_free/Handjet.notdef-outline.retain-all-codepoint.wght=100,ELGR=1,ELSH=2.ttf b/test/subset/data/expected/instance_no_double_free/Handjet.notdef-outline.retain-all-codepoint.wght=100,ELGR=1,ELSH=2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ca588d1308772aa106c3005f60017841dfe8f302 GIT binary patch literal 2696 zcmb`JU1%It6vxkY(7l)p-NH*DQyz9`KZ*A25g$7DP^G{8(R^zGfmcPG`m?h z6Ktdp^HQG_eb7GC4+bC9CkfPt;!77np99k3gW!nLCy@vddVeOxqK3ACV^Q+KDp&ytkJbmh?PqtqtGM<4x za;`8i{LO_gZbN?ux?7kXn|E6|Yd$b@NTABpMCsfb9oyR@^c=jhEXTV`Jxo3T(oUsD-+5i;2_uSyT>HB*I+2)VQQN znSCeeJMA4008c_svAR8|V%p=v{BGy>fT+!(O_6C?PpqL<7i7?Zcy7DaPzmT+?TbvX zi;6=%C;}d}Yc96t5U~T@#H~EWb?jq}Mx!3jP*#J!dg|A$2QGGu{zj>XBUtEr@7){B z4>wVXddvDgWl!rJ)PS1TLdS7SU7Lemtz02zZmqUNPN{gQM$VGw!=juMbu-%^rFrB= zxtseiZp<@Vdqrex_Z=T;kA+y(z^EcZepD$pWTXn~ff2>BISC68*5XQ`w|CiO@emJ0b;vjDqC zRp`l)Da>0${ueN|h!solKLg(iY%js))8mM>h>=ySsdhOJtwt;GUWS*0+>g*8?xTr$ zPGa7lekU+eK&&ScGm<;)-gkFY|mvu%C_3He6th|D*4B%csp2}mDE+Nl3c$Q&RtE}ki_^64GI8<#168jBMU!!4c z#NW2VWa{?@n5v_PpbVK-z_eYah~TOHm@;Hq0n>JwBEm}Ak10c@6)cw_2)nKEQr z0n>JwBEtJY`!Qw6v;wB>GDXxGu^&^0OelEZb@pS*kZA>=MW*d`)%Wfo^3#zt zJC*FnzpZ?-!pTY|E7q)xvB8;V)EiV+Xm`fuI%kxA`+gbWr0AJ4WTMmmD8u9#N@kL( z^O;DVmF5|_UuMmoCwu#sJw)$R4|n(Ozh>C{b~I0aGxFx?{kuq0^&O`yju5}3_%#;O r!ol0)BE3bo@UO;kIW#z83@MB<`WfAf|9Nb)=TOg{fAu}BFcSR%VEVR9 literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/Handjet.ttf b/test/subset/data/fonts/Handjet.ttf new file mode 100644 index 0000000000000000000000000000000000000000..66f4d508e393589324152b53e730470df9d887cc GIT binary patch literal 58944 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 u%?f?Zfsd$L;u6^{aW%=x8WzTrAk{4~i11;