From 3341c7fbfb9bc8e137afd9f16da8cf18eb67b25b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 15:04:35 -0700 Subject: [PATCH 01/20] [fuzzing] Move fuzzing fonts from api/ here --- ...minimized-hb-subset-fuzzer-5521982557782016 | Bin 1228 -> 0 bytes ...minimized-hb-subset-fuzzer-5542653037903872 | Bin 160249 -> 0 bytes ...minimized-hb-subset-fuzzer-5609911946838016 | Bin 313 -> 0 bytes ...minimized-hb-subset-fuzzer-5670861909524480 | Bin 1298 -> 0 bytes ...minimized-hb-subset-fuzzer-5750092395970560 | Bin 72435 -> 0 bytes ...minimized-hb-subset-fuzzer-6651660668502016 | Bin 15229 -> 0 bytes ...bset-get-codepoints-fuzzer-5973295416475648 | Bin 109 -> 0 bytes ...bset-get-codepoints-fuzzer-6136125075750912 | Bin 65816 -> 0 bytes test/api/test-subset-glyf.c | 2 +- test/api/test-subset-hdmx.c | 4 ++-- test/api/test-subset-hmtx.c | 2 +- test/api/test-subset.c | 6 +++--- ...sh-4b60576767ee4d9fe1cc10959d89baf73d4e8249 | Bin ...sh-b577db318b30f2851828a4c9ef97cb30678b1b54 | Bin ...sh-ccc61c92d589f895174cdef6ff2e3b20e9999a1a | Bin ...sh-e4e0bb1458a91b692eba492c907ae1f94e635480 | Bin ...om-6ef8c96d3710262511bcc730dce9c00e722cb653 | Bin ...om-ccc61c92d589f895174cdef6ff2e3b20e9999a1a | Bin 18 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5542653037903872 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750092395970560 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648 delete mode 100644 test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912 rename test/{api => fuzzing}/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249 (100%) rename test/{api => fuzzing}/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54 (100%) rename test/{api => fuzzing}/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a (100%) rename test/{api => fuzzing}/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480 (100%) rename test/{api => fuzzing}/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653 (100%) rename test/{api => fuzzing}/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a (100%) diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016 deleted file mode 100644 index 55541f74951791d86f226c109f0a760932964a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 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 diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480 deleted file mode 100644 index 49bcb30988a73e81f8a5be7d8562ce2bddf759f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 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 BZhZg% diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016 deleted file mode 100644 index 6206f0776c86cda8bc5a474160c125b6da6f5b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15229 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 diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648 deleted file mode 100644 index b506d2a5ab0e6ed72082ae9e5b4c9c24bb6dda7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmZQzWME)mRe*s13JO332g$jK1q=*pKq@r<0SRUX9v%<}23X!P{8s~V*o7DvK;o|K f5E(88{-3Y@AGtk!k`O~hDuVzcTSh8SW&r~Lqn8rN diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912 deleted file mode 100644 index ffcea6460c2ba2e45a5746c0b56560ac0e38321c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65816 zcmeI$ziSg=7{Ku-X)I~+M<{~Yr5!rBh^c8w2W!=(T|}|yB1m&-!xgL*tP%&&O>q(b z11J9tMRXCwu?_`62S=eTh%WKH%cV9YCf6qSczOFhXp_5p?|tt5JQwbLUP*|^u)k$n zZPT;YE_!W564Iz`aj9@8IRCEE`Tu$BY%Tc5PqlCUrx}V!N)l6*-?Ax^8F7~$mec-G zS^u>@nQ@m^%IUt1A-B)8%#2L>`yx~3vY@>=FNq<)n*qtX?n2>&Y5(Bde_W3b4Ob@x#8V~*(%j-pt@VT>Ga>5t|Q1wqP9QkfAQ`#D~J5= z!`^>?-=tj9{`alsev6&|zGkyy!Lfy%=c@bCV=$6NJz1#?_n)tP>y?R#vH5&{Ja@7< z?ktq@MQ5~-%RMR;OGQVde9Co}SG<7*TeA8&S*e&#yr;4Dzj3^OAC(`b3vakRJtn!C z@3)qVg&+nW2q1s}0tg_000Ibfmq1$HzD!E*%~z#^i}!9Hxcm9}XfS~H-8GOs-0h7$ zT*D;@AP{o_uhO@Dn;S^H{_-;zr8i)+I3do=o20i8bIV^nG3!3&v)|uO$&9SZ;b2k3 z9AdLpU_Zap6_d*JK@po!2(%W6=}XaFbe^=nd0HTV00Iag(4GJVKzn`-uLiXtOQ#Ro zR#n+Ho=)eR{t!?Wh-sCmtUx#f5I_KdeJVgfqmpo(eNT5C|(k0T5P-b_gJV00I^YPynbT z)v^M>vf-#a0t7)ILILWT2yy8e0R*~8fN8BtvX}?9$;?~3O+YS3009IL=w<(Fst{L}yFS2q2&?z~oegoXMODb9{sF zJ5$LGzcUqPf*=r9fTAg^6zvc|009In6rcc5NvdrHfNkSZc?bxC00Lbnz$;QEWwyOi zY#WctLqHG&q7z`vFFIR#MgReI0Vby^ Date: Wed, 17 Oct 2018 17:55:47 -0700 Subject: [PATCH 02/20] [trak] Fix calc We were getting the first track record always. Ie. this line: if (trackTable[i].get_track_value () == 0.f) { - trackTableEntry = &trackTable[0]; + trackTableEntry = &trackTable[i]; break; } The rest is cleanup. Fixes https://github.com/harfbuzz/harfbuzz/issues/1263 for the most part. --- src/hb-aat-layout-trak-table.hh | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index e02721750..4b4bc2ffe 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -93,12 +93,11 @@ struct TrackData float s0 = size_table[idx].to_float (); float s1 = size_table[idx + 1].to_float (); float t = unlikely (s0 == s1) ? 0.f : (target_size - s0) / (s1 - s0); - return (float) t * trackTableEntry.get_value (base, idx + 1, sizes) + - ((float) 1.0 - t) * trackTableEntry.get_value (base, idx, sizes); - return 0; + return t * trackTableEntry.get_value (base, idx + 1, sizes) + + (1.f - t) * trackTableEntry.get_value (base, idx, sizes); } - inline float get_tracking (const void *base, float ptem) const + inline int get_tracking (const void *base, float ptem) const { /* CoreText points are CSS pixels (96 per inch), * NOT typographic points (72 per inch). @@ -121,7 +120,7 @@ struct TrackData if (trackTable[i].get_track_value () == 0.f) { - trackTableEntry = &trackTable[0]; + trackTableEntry = &trackTable[i]; break; } } @@ -141,8 +140,8 @@ struct TrackData if (size_table[size_index].to_float () >= csspx) break; - return interpolate_at (size_index ? size_index - 1 : 0, csspx, - *trackTableEntry, base); + return round (interpolate_at (size_index ? size_index - 1 : 0, csspx, + *trackTableEntry, base)); } inline bool sanitize (hb_sanitize_context_t *c, const void *base) const @@ -193,7 +192,7 @@ struct trak if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) { const TrackData &trackData = this+horizData; - float tracking = trackData.get_tracking (this, ptem); + int tracking = trackData.get_tracking (this, ptem); hb_position_t offset_to_add = c->font->em_scalef_x (tracking / 2); hb_position_t advance_to_add = c->font->em_scalef_x (tracking); foreach_grapheme (buffer, start, end) @@ -205,7 +204,7 @@ struct trak else { const TrackData &trackData = this+vertData; - float tracking = trackData.get_tracking (this, ptem); + int tracking = trackData.get_tracking (this, ptem); hb_position_t offset_to_add = c->font->em_scalef_y (tracking / 2); hb_position_t advance_to_add = c->font->em_scalef_y (tracking); foreach_grapheme (buffer, start, end) From fd282eb3285e6d20f77e8a3a7237b677433ccbb4 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 06:33:39 +0330 Subject: [PATCH 03/20] [fuzz] Add a new testcase --- ...fuzz-testcase-hb-shape-fuzzer-5634395566768128 | Bin 0 -> 106 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128 new file mode 100644 index 0000000000000000000000000000000000000000..cd1a2934f38a6fd5b10e0809a2ddebb1fa022c9f GIT binary patch literal 106 zcmZQzWME)m(pP8VU|`5jEvoqc|NmE@h(_v92A~W`Qu#NdCIbtH`wM0u2PD8C#lXM@ jqJcn>iGkGs!er0{)Bpd2)Bu$*F);ks{Qq4CD$4)>y$KK{ literal 0 HcmV?d00001 From 751c10e55e43e2266a5bba024d560c5127fae4b8 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 06:36:48 +0330 Subject: [PATCH 04/20] [fuzz] Add more new testcases --- ...-minimized-hb-shape-fuzzer-5718464350650368 | Bin 0 -> 41 bytes ...-minimized-hb-shape-fuzzer-5738888765636608 | Bin 0 -> 267731 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368 create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368 new file mode 100644 index 0000000000000000000000000000000000000000..d511e9d108a2a3fdd240238cbdf3d65685aa9cdc GIT binary patch literal 41 hcmZQzWME)mQ~-nQ)S?OnAQuQYnIJ+63Scgf003B;1E>H1 literal 0 HcmV?d00001 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 new file mode 100644 index 0000000000000000000000000000000000000000..28e72df7d9622cd628e70aee5a9cc6c1fd914c8c GIT binary patch literal 267731 zcmeI)OHRWu5CBlaiUksg3&3%>07qcOjujW=JRAWW$f7N3)l{}Kv0tP>Kf#`PQwcSm zBweMHo_@Elx7YWNhx9$Ya+^L=ddv^zZF=oF@7H<1$@}y?Z~qVad)-e01PBZ%a5rSu zk|sca009C72oNAZfB*pk1PBlyK!5;&EHE#h&A*TkAV7cs0RjXF5FkK+0D<)dv@@+= z0}&7)K!5-N0%Hoyiv{;%W-n_31PBlyK!5-N0t5&UAV6Sa0@@!pRxsfbAV7cs0RjXF z5FkK+009C72oNAZfB=ED1uQPCT>vLOWxu|B_aX@2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkLHF9BCg^;J*V5FkK+KwAMF-EFK@8jJt|0t5&UAV7cs0RjXF5FkK+Ktlm%_ZniGiU0uu1PBlyK!5-N0t5&UAV7cs z0RjXF5FkLHmVjliTC&C^K!5-N0t5&UAV7cs0RjXF5a>m~O$>Xfq&x@^AV7cs0RjXF z5FpTxfPRmDYAF)}1PBlyK!5-N0t5&UAV7csfiVU2ql{U1SrZ^YfB*pk1PBlyKp?V! zew4`75gP#l1PBlyK!5-N0t5&UAV7csfye?nVIo&YYy=1pAV7cs0RjXF5ExTHC(M|2 zmo)(b1PBlyK!5-N0t5&UAV7e?`2zYq&bM+T0RjXF5FkK+009C72(%H<@6pEDECdJ; zAV7cs0RjXF5FkK+009C7Y6<8^sU>S%0t5&UAV7cs0RjXF5V%x8Kgy+Y{*C|v0t5&U zAV7cs0RjXF5FkK+009C72oNAZV1ojd$2M3rArl}#fB*pk1PBlyK!5-N0t5&U*b#8K z_6~-J1PBlyK!5-N0t5&UAP_=8KT3!)2!a3s0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfIt8Novs0jAOr#g2oNAZfB*pk1PBn=6VU0p$KeS90t5&UAV7cs0RjXF5FkK+0D%n& zIJ>u@VhNQ10RjXF5FkK+009C72oNAZfB*pk1PBlyu#SL>o7ZtSD**xo2oNAZfB*pk z1PB}#(EfPb#ybQE5FkK+009C72oNAZfB*pk1SSFf9zF*I2oNAZfB*pk1PBly5KTb8 zN3@EFhX4Tr1PBlyK!5-N0t5&UAV7e?G6DT4%e)*-fB*pk1PBlyK!5-N0`&#-qtrJx X0|5dA2oNAZfB*pk1PBlyFu1@E98L-q literal 0 HcmV?d00001 From eeddda3ec6c28b411d33c74938ec6198c7f6888d Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 07:38:47 +0330 Subject: [PATCH 05/20] [util] Better file-not-found error from hb-shape / hb-view fixes #1266 --- util/options.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/options.cc b/util/options.cc index 26b0bd0a8..5661cd059 100644 --- a/util/options.cc +++ b/util/options.cc @@ -660,7 +660,7 @@ font_options_t::get_font (void) const blob = hb_blob_create_from_file (font_path); if (blob == hb_blob_get_empty ()) - fail (false, "No such file or directory"); + fail (false, "Couldn't read or find %s, or it was empty.", font_path); /* Create the face */ hb_face_t *face = hb_face_create (blob, face_index); From 392e1f4ddd7eb649e1a71755b9bcf6431739f98f Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 07:42:20 +0330 Subject: [PATCH 06/20] [test/shape-fuzzer] fail on timeout and ubsan errors (#1267) --- test/fuzzing/run-shape-fuzzer-tests.py | 38 +++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test/fuzzing/run-shape-fuzzer-tests.py b/test/fuzzing/run-shape-fuzzer-tests.py index 074ecc8ea..8fadd167f 100755 --- a/test/fuzzing/run-shape-fuzzer-tests.py +++ b/test/fuzzing/run-shape-fuzzer-tests.py @@ -2,7 +2,36 @@ from __future__ import print_function, division, absolute_import -import sys, os, subprocess +import sys, os, subprocess, tempfile, threading + + +def cmd(command): + # https://stackoverflow.com/a/4408409 + # https://stackoverflow.com/a/10012262 + with tempfile.TemporaryFile() as tempf: + p = subprocess.Popen (command, stderr=tempf) + is_killed = {'value': False} + + def timeout(p, is_killed): + is_killed['value'] = True + p.kill() + timer = threading.Timer (2, timeout, [p, is_killed]) + + try: + timer.start() + p.wait () + tempf.seek (0) + text = tempf.read().decode ("utf-8").strip () + returncode = p.returncode + finally: + timer.cancel() + + if is_killed['value']: + text = 'error: timeout, ' + text + returncode = 1 + + return text, returncode + srcdir = os.environ.get ("srcdir", ".") EXEEXT = os.environ.get ("EXEEXT", "") @@ -24,10 +53,11 @@ parent_path = os.path.join (srcdir, "fonts") for file in os.listdir (parent_path): path = os.path.join(parent_path, file) - p = subprocess.Popen ([hb_shape_fuzzer, path]) + text, returncode = cmd ([hb_shape_fuzzer, path]) + print (text) - if p.wait () != 0: - print ('failure on %s', font) + if returncode != 0 or 'error' in text: + print ('failure on %s' % file) fails = fails + 1 if fails: From 191eef823fe95355425621f8e002dfe7fe632383 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 08:04:18 +0330 Subject: [PATCH 07/20] [test] Remove not-fixed yet testcases (#1268) I added them but now that I think, it is a bad idea to have them as fuzzing bots will find good seeds to tweak in order to find easy new testcases which causes duplicated issues. --- ...stcase-minimized-hb-fuzzer-4548492505645056 | Bin 122 -> 0 bytes ...stcase-minimized-hb-fuzzer-6210176798425088 | Bin 1420 -> 0 bytes ...-minimized-hb-shape-fuzzer-5738888765636608 | Bin 267731 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 delete mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6210176798425088 delete mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 deleted file mode 100644 index 065080f3a2f96054b8cf4107aaf60d59e8986b92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 ycmZQzWME)mQy>bs2ZuU=6asZ55!T=&z`y`j4YGlY0mx%u%B{>bV&DRcG5`Q-w+R<$lKrkPW2FZYJ0GXzs000wrzv%z~ diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 deleted file mode 100644 index 28e72df7d9622cd628e70aee5a9cc6c1fd914c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267731 zcmeI)OHRWu5CBlaiUksg3&3%>07qcOjujW=JRAWW$f7N3)l{}Kv0tP>Kf#`PQwcSm zBweMHo_@Elx7YWNhx9$Ya+^L=ddv^zZF=oF@7H<1$@}y?Z~qVad)-e01PBZ%a5rSu zk|sca009C72oNAZfB*pk1PBlyK!5;&EHE#h&A*TkAV7cs0RjXF5FkK+0D<)dv@@+= z0}&7)K!5-N0%Hoyiv{;%W-n_31PBlyK!5-N0t5&UAV6Sa0@@!pRxsfbAV7cs0RjXF z5FkK+009C72oNAZfB=ED1uQPCT>vLOWxu|B_aX@2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkLHF9BCg^;J*V5FkK+KwAMF-EFK@8jJt|0t5&UAV7cs0RjXF5FkK+Ktlm%_ZniGiU0uu1PBlyK!5-N0t5&UAV7cs z0RjXF5FkLHmVjliTC&C^K!5-N0t5&UAV7cs0RjXF5a>m~O$>Xfq&x@^AV7cs0RjXF z5FpTxfPRmDYAF)}1PBlyK!5-N0t5&UAV7csfiVU2ql{U1SrZ^YfB*pk1PBlyKp?V! zew4`75gP#l1PBlyK!5-N0t5&UAV7csfye?nVIo&YYy=1pAV7cs0RjXF5ExTHC(M|2 zmo)(b1PBlyK!5-N0t5&UAV7e?`2zYq&bM+T0RjXF5FkK+009C72(%H<@6pEDECdJ; zAV7cs0RjXF5FkK+009C7Y6<8^sU>S%0t5&UAV7cs0RjXF5V%x8Kgy+Y{*C|v0t5&U zAV7cs0RjXF5FkK+009C72oNAZV1ojd$2M3rArl}#fB*pk1PBlyK!5-N0t5&U*b#8K z_6~-J1PBlyK!5-N0t5&UAP_=8KT3!)2!a3s0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfIt8Novs0jAOr#g2oNAZfB*pk1PBn=6VU0p$KeS90t5&UAV7cs0RjXF5FkK+0D%n& zIJ>u@VhNQ10RjXF5FkK+009C72oNAZfB*pk1PBlyu#SL>o7ZtSD**xo2oNAZfB*pk z1PB}#(EfPb#ybQE5FkK+009C72oNAZfB*pk1SSFf9zF*I2oNAZfB*pk1PBly5KTb8 zN3@EFhX4Tr1PBlyK!5-N0t5&UAV7e?G6DT4%e)*-fB*pk1PBlyK!5-N0`&#-qtrJx X0|5dA2oNAZfB*pk1PBlyFu1@E98L-q From 9e8a9b846ec24e9124d61706272a0e5fa58d7a24 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 21:41:25 -0700 Subject: [PATCH 08/20] [aat] Another try at fixing Lookup null objects... Ugly as hell, and don't even understand why some bits are needed. But the logic is sound. --- src/hb-aat-layout-common.hh | 23 ++++++++++++++++++++--- src/hb-static.cc | 4 ++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 37f6d03cf..741e5020d 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -291,10 +291,27 @@ struct Lookup LookupFormat8 format8; } u; public: - DEFINE_SIZE_MIN (0); /* 0 min size, makes sure this cannot be used on null pool, - * because Format0 has unbounded size depending on num_glyphs. - * We cannot define custom null bytes for a template :(. */ + DEFINE_SIZE_UNION (2, format); }; +/* Lookup 0 has unbounded size (dependant on num_glyphs). So we need to defined + * special NULL objects for Lookup<> objects, but since it's template our macros + * don't work. So we have to hand-code them here. UGLY. */ +} /* Close namespace. */ +/* Ugly hand-coded null objects for template Lookup<> :(. */ +extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2]; +template <> +/*static*/ inline const AAT::Lookup& Null > (void) { + return *reinterpret_cast *> (_hb_Null_AAT_Lookup); +} +template <> +/*static*/ inline const AAT::Lookup& Null > (void) { + return *reinterpret_cast *> (_hb_Null_AAT_Lookup); +} +template <> +/*static*/ inline const AAT::Lookup>& Null> > (void) { + return *reinterpret_cast> *> (_hb_Null_AAT_Lookup); +} +namespace AAT { /* diff --git a/src/hb-static.cc b/src/hb-static.cc index 5112d77be..0b92443e7 100644 --- a/src/hb-static.cc +++ b/src/hb-static.cc @@ -41,6 +41,10 @@ hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_ DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00}; DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00}; +/* Hand-coded because Lookup is a template. + * Not sure why I need the extern "C" :(. + * Sad. */ +extern "C" HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF}; void From af99b20dfddbca75e68f84c5aa465a54728990a6 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 08:35:20 +0330 Subject: [PATCH 09/20] [ci/ubsan] Disable enum sanitization Behdad apparently not interested on them --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1cf4bc885..0eb35f875 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -168,7 +168,7 @@ jobs: - run: apt update || true - run: apt install -y clang lld binutils libtool autoconf automake make pkg-config ragel libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip - run: pip install fonttools - - run: CPPFLAGS="-fsanitize=undefined" LDFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 + - run: CPPFLAGS="-fsanitize=undefined -fno-sanitize=enum" LDFLAGS="-fsanitize=undefined -fno-sanitize=enum -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=undefined -fno-sanitize=enum -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 - run: make -j32 - run: make check || .ci/fail.sh | asan_symbolize | c++filt From b9478e28ac4361353e4920d749cc5d29e5bfef67 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 21:52:14 -0700 Subject: [PATCH 10/20] Revert "[test] Remove not-fixed yet testcases (#1268)" This reverts commit 191eef823fe95355425621f8e002dfe7fe632383. --- ...stcase-minimized-hb-fuzzer-4548492505645056 | Bin 0 -> 122 bytes ...stcase-minimized-hb-fuzzer-6210176798425088 | Bin 0 -> 1420 bytes ...-minimized-hb-shape-fuzzer-5738888765636608 | Bin 0 -> 267731 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6210176798425088 create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 new file mode 100644 index 0000000000000000000000000000000000000000..065080f3a2f96054b8cf4107aaf60d59e8986b92 GIT binary patch literal 122 ycmZQzWME)mQy>bs2ZuU=6asZ55!T=&z`y`j4YGlY0mx%u%B{>bV&DRcG5`Q-w+R<$lKrkPW2FZYJ0GXzs000wrzv%z~ literal 0 HcmV?d00001 diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 new file mode 100644 index 0000000000000000000000000000000000000000..28e72df7d9622cd628e70aee5a9cc6c1fd914c8c GIT binary patch literal 267731 zcmeI)OHRWu5CBlaiUksg3&3%>07qcOjujW=JRAWW$f7N3)l{}Kv0tP>Kf#`PQwcSm zBweMHo_@Elx7YWNhx9$Ya+^L=ddv^zZF=oF@7H<1$@}y?Z~qVad)-e01PBZ%a5rSu zk|sca009C72oNAZfB*pk1PBlyK!5;&EHE#h&A*TkAV7cs0RjXF5FkK+0D<)dv@@+= z0}&7)K!5-N0%Hoyiv{;%W-n_31PBlyK!5-N0t5&UAV6Sa0@@!pRxsfbAV7cs0RjXF z5FkK+009C72oNAZfB=ED1uQPCT>vLOWxu|B_aX@2oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkLHF9BCg^;J*V5FkK+KwAMF-EFK@8jJt|0t5&UAV7cs0RjXF5FkK+Ktlm%_ZniGiU0uu1PBlyK!5-N0t5&UAV7cs z0RjXF5FkLHmVjliTC&C^K!5-N0t5&UAV7cs0RjXF5a>m~O$>Xfq&x@^AV7cs0RjXF z5FpTxfPRmDYAF)}1PBlyK!5-N0t5&UAV7csfiVU2ql{U1SrZ^YfB*pk1PBlyKp?V! zew4`75gP#l1PBlyK!5-N0t5&UAV7csfye?nVIo&YYy=1pAV7cs0RjXF5ExTHC(M|2 zmo)(b1PBlyK!5-N0t5&UAV7e?`2zYq&bM+T0RjXF5FkK+009C72(%H<@6pEDECdJ; zAV7cs0RjXF5FkK+009C7Y6<8^sU>S%0t5&UAV7cs0RjXF5V%x8Kgy+Y{*C|v0t5&U zAV7cs0RjXF5FkK+009C72oNAZV1ojd$2M3rArl}#fB*pk1PBlyK!5-N0t5&U*b#8K z_6~-J1PBlyK!5-N0t5&UAP_=8KT3!)2!a3s0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfIt8Novs0jAOr#g2oNAZfB*pk1PBn=6VU0p$KeS90t5&UAV7cs0RjXF5FkK+0D%n& zIJ>u@VhNQ10RjXF5FkK+009C72oNAZfB*pk1PBlyu#SL>o7ZtSD**xo2oNAZfB*pk z1PB}#(EfPb#ybQE5FkK+009C72oNAZfB*pk1SSFf9zF*I2oNAZfB*pk1PBly5KTb8 zN3@EFhX4Tr1PBlyK!5-N0t5&UAV7e?G6DT4%e)*-fB*pk1PBlyK!5-N0`&#-qtrJx X0|5dA2oNAZfB*pk1PBlyFu1@E98L-q literal 0 HcmV?d00001 From 83780308b41b029513ac2568b6688d3eaad77338 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 22:34:16 -0700 Subject: [PATCH 11/20] [aat] Fix sanitize slowdown Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11034 --- src/hb-aat-layout-common.hh | 4 ++++ src/hb-machinery.hh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 741e5020d..69768e5eb 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -422,6 +422,8 @@ struct StateTable num_states, num_classes * states[0].static_size))) return_trace (false); + if ((c->max_ops -= num_states - state) < 0) + return_trace (false); { /* Sweep new states. */ const HBUINT16 *stop = &states[num_states * num_classes]; for (const HBUINT16 *p = &states[state * num_classes]; p < stop; p++) @@ -431,6 +433,8 @@ struct StateTable if (unlikely (!c->check_array (entries, num_entries))) return_trace (false); + if ((c->max_ops -= num_entries - entry) < 0) + return_trace (false); { /* Sweep new entries. */ const Entry *stop = &entries[num_entries]; for (const Entry *p = &entries[entry]; p < stop; p++) diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index a6ff6e7b9..3bdbb2eb4 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -443,10 +443,10 @@ struct hb_sanitize_context_t : mutable unsigned int debug_depth; const char *start, *end; + mutable int max_ops; private: bool writable; unsigned int edit_count; - mutable int max_ops; hb_blob_t *blob; unsigned int num_glyphs; bool num_glyphs_set; From 6da8ef3f9f4706fe88715fabdba7904ff279539b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 22:37:34 -0700 Subject: [PATCH 12/20] Fix some wierdness... --- src/hb-static.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hb-static.cc b/src/hb-static.cc index 0b92443e7..ea9bd5a71 100644 --- a/src/hb-static.cc +++ b/src/hb-static.cc @@ -28,6 +28,7 @@ #include "hb-open-type.hh" #include "hb-ot-layout-common.hh" +#include "hb-aat-layout-common.hh" #include "hb-face.hh" #include "hb-ot-head-table.hh" @@ -41,10 +42,8 @@ hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_ DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00}; DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00}; -/* Hand-coded because Lookup is a template. - * Not sure why I need the extern "C" :(. - * Sad. */ -extern "C" HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF}; +/* Hand-coded because Lookup is a template. Sad. */ +HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF}; void From 270a37c3244b32dd839a99eb379be241613ee895 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 22:42:47 -0700 Subject: [PATCH 13/20] Kick bots --- src/hb-aat-layout-common.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 69768e5eb..89ed91f28 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -308,8 +308,8 @@ template <> return *reinterpret_cast *> (_hb_Null_AAT_Lookup); } template <> -/*static*/ inline const AAT::Lookup>& Null> > (void) { - return *reinterpret_cast> *> (_hb_Null_AAT_Lookup); +/*static*/ inline const AAT::Lookup >& Null > > (void) { + return *reinterpret_cast > *> (_hb_Null_AAT_Lookup); } namespace AAT { From c406aca19303e61fa5ba15d215386cfc6d920124 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 22:58:43 -0700 Subject: [PATCH 14/20] Fix warning --- src/hb-machinery.hh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index 3bdbb2eb4..d836a94d6 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -227,7 +227,8 @@ struct hb_sanitize_context_t : inline hb_sanitize_context_t (void) : debug_depth (0), start (nullptr), end (nullptr), - writable (false), edit_count (0), max_ops (0), + max_ops (0), + writable (false), edit_count (0), blob (nullptr), num_glyphs (65536), num_glyphs_set (false) {} From 40606abd0cd40faf3973d0a8c30af90d36ae8231 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 23:06:37 -0700 Subject: [PATCH 15/20] Fix build --- src/hb-static.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-static.cc b/src/hb-static.cc index ea9bd5a71..4bc1c69ad 100644 --- a/src/hb-static.cc +++ b/src/hb-static.cc @@ -28,6 +28,7 @@ #include "hb-open-type.hh" #include "hb-ot-layout-common.hh" +#include "hb-aat-layout-ankr-table.hh" /* I don't even want to know why... */ #include "hb-aat-layout-common.hh" #include "hb-face.hh" From f1ced9be378d7c7ad3ea35a1cee6f9aff7a44a13 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 17 Oct 2018 23:06:53 -0700 Subject: [PATCH 16/20] More warning fix Okay, let's see if the gods are happy now... --- src/hb-static.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-static.cc b/src/hb-static.cc index 4bc1c69ad..e5507960d 100644 --- a/src/hb-static.cc +++ b/src/hb-static.cc @@ -44,7 +44,7 @@ DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00}; DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00}; /* Hand-coded because Lookup is a template. Sad. */ -HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF}; +const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF}; void From 64df6b0b0f9d221e14811084f2412a01cf4deb46 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 18 Oct 2018 00:35:01 -0700 Subject: [PATCH 17/20] [AUTHORS] Add Ebrahim and Khaled --- AUTHORS | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index 81cdc4cf3..0763761bb 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,9 +1,11 @@ Behdad Esfahbod -Simon Hausmann -Martin Hosken -Jonathan Kew -Lars Knoll -Werner Lemberg -Roozbeh Pournader -Owen Taylor David Turner +Ebrahim Byagowi +Jonathan Kew +Khaled Hosny +Lars Knoll +Martin Hosken +Owen Taylor +Roozbeh Pournader +Simon Hausmann +Werner Lemberg From 03e144135b5c691e3942d1aef917fe2246665fb6 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 11:06:37 +0330 Subject: [PATCH 18/20] [ubsan] Use unsigned int instead enum where needed (#1270) Actually the check is right, On -myanmar.hh, on that particular switch, OT_C is indic_category_t but OT_D is myanmar_category_t so we are mixing the types in one variable. And on -arabic.cc, step can goes one number higher than step_t enum in the loop so we are actually using it as an unsinged int. --- .circleci/config.yml | 2 +- src/hb-ot-shape-complex-arabic.cc | 4 +-- src/hb-ot-shape-complex-myanmar.hh | 48 +++++++++++++++--------------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0eb35f875..1cf4bc885 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -168,7 +168,7 @@ jobs: - run: apt update || true - run: apt install -y clang lld binutils libtool autoconf automake make pkg-config ragel libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev python python-pip - run: pip install fonttools - - run: CPPFLAGS="-fsanitize=undefined -fno-sanitize=enum" LDFLAGS="-fsanitize=undefined -fno-sanitize=enum -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=undefined -fno-sanitize=enum -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 + - run: CPPFLAGS="-fsanitize=undefined" LDFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" CFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" CXXFLAGS="-fsanitize=undefined -O1 -g -fno-omit-frame-pointer" LD=ld.lld CC=clang CXX=clang++ ./autogen.sh --with-freetype --with-glib --with-cairo --with-icu --with-graphite2 - run: make -j32 - run: make check || .ci/fail.sh | asan_symbolize | c++filt diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc index 0fbc05d8d..b56443910 100644 --- a/src/hb-ot-shape-complex-arabic.cc +++ b/src/hb-ot-shape-complex-arabic.cc @@ -458,9 +458,9 @@ apply_stch (const hb_ot_shape_plan_t *plan, int sign = font->x_scale < 0 ? -1 : +1; unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT - typedef enum { MEASURE, CUT } step_t; + enum { MEASURE, CUT } /* step_t */; - for (step_t step = MEASURE; step <= CUT; step = (step_t) (step + 1)) + for (unsigned int step = MEASURE; step <= CUT; step = step + 1) { unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; diff --git a/src/hb-ot-shape-complex-myanmar.hh b/src/hb-ot-shape-complex-myanmar.hh index 7b6fd4837..3e9537a64 100644 --- a/src/hb-ot-shape-complex-myanmar.hh +++ b/src/hb-ot-shape-complex-myanmar.hh @@ -64,42 +64,42 @@ set_myanmar_properties (hb_glyph_info_t &info) { hb_codepoint_t u = info.codepoint; unsigned int type = hb_indic_get_categories (u); - indic_category_t cat = (indic_category_t) (type & 0x7Fu); + unsigned int cat = type & 0x7Fu; indic_position_t pos = (indic_position_t) (type >> 8); /* Myanmar * https://docs.microsoft.com/en-us/typography/script-development/myanmar#analyze */ if (unlikely (hb_in_range (u, 0xFE00u, 0xFE0Fu))) - cat = (indic_category_t) OT_VS; + cat = OT_VS; switch (u) { case 0x104Eu: - cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */ + cat = OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */ break; case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u: case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u: case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu: case 0x25FEu: - cat = (indic_category_t) OT_GB; + cat = OT_GB; break; case 0x1004u: case 0x101Bu: case 0x105Au: - cat = (indic_category_t) OT_Ra; + cat = OT_Ra; break; case 0x1032u: case 0x1036u: - cat = (indic_category_t) OT_A; + cat = OT_A; break; case 0x1039u: - cat = (indic_category_t) OT_H; + cat = OT_H; break; case 0x103Au: - cat = (indic_category_t) OT_As; + cat = OT_As; break; case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u: @@ -107,47 +107,47 @@ set_myanmar_properties (hb_glyph_info_t &info) case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u: case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u: case 0x1097u: case 0x1098u: case 0x1099u: - cat = (indic_category_t) OT_D; + cat = OT_D; break; case 0x1040u: - cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */ + cat = OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */ break; case 0x103Eu: case 0x1060u: - cat = (indic_category_t) OT_MH; + cat = OT_MH; break; case 0x103Cu: - cat = (indic_category_t) OT_MR; + cat = OT_MR; break; case 0x103Du: case 0x1082u: - cat = (indic_category_t) OT_MW; + cat = OT_MW; break; case 0x103Bu: case 0x105Eu: case 0x105Fu: - cat = (indic_category_t) OT_MY; + cat = OT_MY; break; case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au: case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu: - cat = (indic_category_t) OT_PT; + cat = OT_PT; break; case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u: case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du: case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu: - cat = (indic_category_t) OT_SM; + cat = OT_SM; break; case 0x104Au: case 0x104Bu: - cat = (indic_category_t) OT_P; + cat = OT_P; break; case 0xAA74u: case 0xAA75u: case 0xAA76u: /* https://github.com/roozbehp/unicode-data/issues/3 */ - cat = (indic_category_t) OT_C; + cat = OT_C; break; } @@ -155,15 +155,15 @@ set_myanmar_properties (hb_glyph_info_t &info) { switch ((int) pos) { - case POS_PRE_C: cat = (indic_category_t) OT_VPre; - pos = POS_PRE_M; break; - case POS_ABOVE_C: cat = (indic_category_t) OT_VAbv; break; - case POS_BELOW_C: cat = (indic_category_t) OT_VBlw; break; - case POS_POST_C: cat = (indic_category_t) OT_VPst; break; + case POS_PRE_C: cat = OT_VPre; + pos = POS_PRE_M; break; + case POS_ABOVE_C: cat = OT_VAbv; break; + case POS_BELOW_C: cat = OT_VBlw; break; + case POS_POST_C: cat = OT_VPst; break; } } - info.myanmar_category() = (myanmar_category_t) cat; + info.myanmar_category() = cat; info.myanmar_position() = pos; } From 535ca678bf9c8ab470ebf5ad84a090328d79d42b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 18 Oct 2018 05:58:04 -0700 Subject: [PATCH 19/20] [test] Don't use newer glib API --- test/api/test-ot-tag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/api/test-ot-tag.c b/test/api/test-ot-tag.c index 993836e2d..f89c25deb 100644 --- a/test/api/test-ot-tag.c +++ b/test/api/test-ot-tag.c @@ -464,8 +464,8 @@ test_tags (hb_script_t script, unsigned int i; hb_tag_t *script_tags = malloc (script_count * sizeof (hb_tag_t)); hb_tag_t *language_tags = malloc (language_count * sizeof (hb_tag_t)); - g_assert_nonnull (script_tags); - g_assert_nonnull (language_tags); + g_assert (script_tags); + g_assert (language_tags); hb_language_t lang = hb_language_from_string (lang_s, -1); va_start (expected_tags, expected_language_count); From 3d9a0306ebb48706778fd2c487c3cacc7d508d6c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 18 Oct 2018 05:58:17 -0700 Subject: [PATCH 20/20] 2.0.0 --- NEWS | 68 +++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 +- src/hb-buffer.cc | 4 +-- src/hb-common.h | 4 +-- src/hb-deprecated.h | 18 ++++++------ src/hb-font.cc | 6 ++-- src/hb-font.h | 2 +- src/hb-ot-layout.cc | 8 +++--- src/hb-ot-name.h | 4 +-- src/hb-ot-tag.cc | 4 +-- src/hb-ot-tag.h | 4 +-- src/hb-version.h | 6 ++-- 12 files changed, 99 insertions(+), 31 deletions(-) diff --git a/NEWS b/NEWS index c9af0f368..58e21a592 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,71 @@ +Overview of changes leading to 2.0.0 +Wednesday, October 17, 2018 +==================================== +- Added AAT shaping support (morx/kerx/trak). + Automatically used if GSUB/GPOS are not available respectively. + Set HB_OPTIONS=aat env var to have morx/kerx preferred over + GSUB/GPOS. +- Apply TrueType kern table internally, instead of relying on + hb_font_t callbacks. +- Khmer shaper significantly rewritten to better match Uniscribe. +- Indic3 tags ('dev3', etc) are passed to USE shaper. +- .dfont Mac font containers implemented. +- Script- and language-mapping revamped to better use BCP 47. +- Misc USE and Indic fixes. +- Misc everything fixes. +- Too many things to list. Biggest release since 0.9.1, with + over 500 commits in just over 5 weeks! Didn't intend it to + be a big release. Just happened to become. +- hb-ft now locks underlying FT_Face during use. + +API changes: + +- Newly-created hb_font_t's now have our internal "hb-ot-font" + callbacks set on them, so they should work out of the box + without any callbacks set. If callbacks are set, everything + is back to what it was before, the fallback callbacks are + null. If you to get the internal implementation modified, + sub_font it. + +- New hb_font_funcs_set_nominal_glyphs_func() allows speeding + up character to glyph mapping. + +New API: ++HB_FEATURE_GLOBAL_START ++HB_FEATURE_GLOBAL_END ++hb_buffer_set_invisible_glyph() ++hb_buffer_get_invisible_glyph() ++hb_font_funcs_set_nominal_glyphs_func() ++hb_ot_layout_table_select_script() ++hb_ot_layout_script_select_language() ++hb_ot_layout_feature_get_name_ids() ++hb_ot_layout_feature_get_characters() ++hb_name_id_t ++HB_NAME_ID_INVALID ++HB_OT_MAX_TAGS_PER_SCRIPT ++hb_ot_tags_from_script_and_language() ++hb_ot_tags_to_script_and_language() + +Deprecated API: +-hb_font_funcs_set_glyph_func() +-hb_unicode_eastasian_width_func_t +-hb_unicode_funcs_set_eastasian_width_func() +-hb_unicode_eastasian_width() +-hb_unicode_decompose_compatibility_func_t +-HB_UNICODE_MAX_DECOMPOSITION_LEN +-hb_unicode_funcs_set_decompose_compatibility_func() +-hb_unicode_decompose_compatibility() +-hb_font_funcs_set_glyph_h_kerning_func() +-hb_font_funcs_set_glyph_v_kerning_func() +-hb_font_get_glyph_h_kerning() +-hb_font_get_glyph_v_kerning() +-hb_font_get_glyph_kerning_for_direction() +-hb_ot_layout_table_choose_script() +-hb_ot_layout_script_find_language() +-hb_ot_tags_from_script() +-hb_ot_tag_from_language() + + Overview of changes leading to 1.9.0 Monday, September 10, 2018 ==================================== diff --git a/configure.ac b/configure.ac index 1b9ddfe7c..a3ce8c1e8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [1.9.0], + [2.0.0], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 00e7e149c..ce9b0530c 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -1190,7 +1190,7 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer) * U+0020 SPACE character is used. Otherwise, this value is used * verbatim. * - * Since: REPLACEME + * Since: 2.0.0 **/ void hb_buffer_set_invisible_glyph (hb_buffer_t *buffer, @@ -1211,7 +1211,7 @@ hb_buffer_set_invisible_glyph (hb_buffer_t *buffer, * Return value: * The @buffer invisible #hb_codepoint_t. * - * Since: REPLACEME + * Since: 2.0.0 **/ hb_codepoint_t hb_buffer_get_invisible_glyph (hb_buffer_t *buffer) diff --git a/src/hb-common.h b/src/hb-common.h index c601b1f66..2f09f4318 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -401,13 +401,13 @@ typedef void (*hb_destroy_func_t) (void *user_data); /** * HB_FEATURE_GLOBAL_START * - * Since: REPLACEME + * Since: 2.0.0 */ #define HB_FEATURE_GLOBAL_START 0 /** * HB_FEATURE_GLOBAL_END * - * Since: REPLACEME + * Since: 2.0.0 */ #define HB_FEATURE_GLOBAL_END ((unsigned int) -1) diff --git a/src/hb-deprecated.h b/src/hb-deprecated.h index 52ee49e2b..5af9bdbd8 100644 --- a/src/hb-deprecated.h +++ b/src/hb-deprecated.h @@ -61,7 +61,7 @@ hb_set_invert (hb_set_t *set); /** * hb_unicode_eastasian_width_func_t: * - * Deprecated: REPLACEME + * Deprecated: 2.0.0 */ typedef unsigned int (*hb_unicode_eastasian_width_func_t) (hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, @@ -77,7 +77,7 @@ typedef unsigned int (*hb_unicode_eastasian_width_func_t) (hb_unicode_funcs_t * * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ HB_EXTERN HB_DEPRECATED void hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, @@ -88,7 +88,7 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, * hb_unicode_eastasian_width: * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ HB_EXTERN HB_DEPRECATED unsigned int hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs, @@ -113,7 +113,7 @@ hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs, * * Return value: number of codepoints in the full compatibility decomposition of @u, or 0 if no decomposition available. * - * Deprecated: REPLACEME + * Deprecated: 2.0.0 */ typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_funcs_t *ufuncs, hb_codepoint_t u, @@ -125,7 +125,7 @@ typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_ * * See Unicode 6.1 for details on the maximum decomposition length. * - * Deprecated: REPLACEME + * Deprecated: 2.0.0 */ #define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */ @@ -139,7 +139,7 @@ typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_ * * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ HB_EXTERN HB_DEPRECATED void hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs, @@ -150,7 +150,7 @@ hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs, * hb_unicode_decompose_compatibility: * * - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ HB_EXTERN HB_DEPRECATED unsigned int hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, @@ -174,7 +174,7 @@ typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; * * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ HB_EXTERN void hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, @@ -191,7 +191,7 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, * * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ HB_EXTERN void hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, diff --git a/src/hb-font.cc b/src/hb-font.cc index c9656cee7..7a430237c 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -922,7 +922,7 @@ hb_font_get_glyph_v_origin (hb_font_t *font, * Return value: * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_h_kerning (hb_font_t *font, @@ -942,7 +942,7 @@ hb_font_get_glyph_h_kerning (hb_font_t *font, * Return value: * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, @@ -1171,7 +1171,7 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, * * * Since: 0.9.2 - * Deprecated: REPLACEME + * Deprecated: 2.0.0 **/ void hb_font_get_glyph_kerning_for_direction (hb_font_t *font, diff --git a/src/hb-font.h b/src/hb-font.h index dc88f26c3..74c61aba4 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -237,7 +237,7 @@ hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs, * * * - * Since: REPLACEME + * Since: 2.0.0 **/ HB_EXTERN void hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs, diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index af38dcb02..fb1d9b11f 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -376,7 +376,7 @@ hb_ot_layout_table_choose_script (hb_face_t *face, /** * hb_ot_layout_table_select_script: * - * Since: REPLACEME + * Since: 2.0.0 **/ hb_bool_t hb_ot_layout_table_select_script (hb_face_t *face, @@ -489,7 +489,7 @@ hb_ot_layout_script_find_language (hb_face_t *face, /** * hb_ot_layout_script_select_language: * - * Since: REPLACEME + * Since: 2.0.0 **/ hb_bool_t hb_ot_layout_script_select_language (hb_face_t *face, @@ -1134,7 +1134,7 @@ hb_ot_layout_get_size_params (hb_face_t *face, * * Return value: true if data found, false otherwise * - * Since: REPLACEME + * Since: 2.0.0 **/ hb_bool_t hb_ot_layout_feature_get_name_ids (hb_face_t *face, @@ -1207,7 +1207,7 @@ hb_ot_layout_feature_get_name_ids (hb_face_t *face, * * Return value: Number of total sample characters in the cvXX feature. * - * Since: REPLACEME + * Since: 2.0.0 **/ unsigned int hb_ot_layout_feature_get_characters (hb_face_t *face, diff --git a/src/hb-ot-name.h b/src/hb-ot-name.h index 0fdd63bbd..49423e87c 100644 --- a/src/hb-ot-name.h +++ b/src/hb-ot-name.h @@ -37,14 +37,14 @@ HB_BEGIN_DECLS /** * hb_name_id_t: * - * Since: REPLACEME + * Since: 2.0.0 */ typedef unsigned int hb_name_id_t; /** * HB_NAME_ID_INVALID * - * Since: REPLACEME + * Since: 2.0.0 **/ #define HB_NAME_ID_INVALID 0xFFFF diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index 7bcc63abc..3d4e8b066 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -336,7 +336,7 @@ parse_private_use_subtag (const char *private_use_subtag, * * Converts an #hb_script_t and an #hb_language_t to script and language tags. * - * Since: REPLACEME + * Since: 2.0.0 **/ void hb_ot_tags_from_script_and_language (hb_script_t script, @@ -448,7 +448,7 @@ hb_ot_tag_to_language (hb_tag_t tag) * Converts a script tag and a language tag to an #hb_script_t and an * #hb_language_t. * - * Since: REPLACEME + * Since: 2.0.0 **/ void hb_ot_tags_to_script_and_language (hb_tag_t script_tag, diff --git a/src/hb-ot-tag.h b/src/hb-ot-tag.h index f7a061c70..33a4dbdbc 100644 --- a/src/hb-ot-tag.h +++ b/src/hb-ot-tag.h @@ -42,13 +42,13 @@ HB_BEGIN_DECLS /** * HB_OT_MAX_TAGS_PER_SCRIPT: * - * Since: REPLACEME + * Since: 2.0.0 **/ #define HB_OT_MAX_TAGS_PER_SCRIPT 3u /** * HB_OT_MAX_TAGS_PER_LANGUAGE: * - * Since: REPLACEME + * Since: 2.0.0 **/ #define HB_OT_MAX_TAGS_PER_LANGUAGE 3u diff --git a/src/hb-version.h b/src/hb-version.h index 346495104..d10a168a6 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -36,11 +36,11 @@ HB_BEGIN_DECLS -#define HB_VERSION_MAJOR 1 -#define HB_VERSION_MINOR 9 +#define HB_VERSION_MAJOR 2 +#define HB_VERSION_MINOR 0 #define HB_VERSION_MICRO 0 -#define HB_VERSION_STRING "1.9.0" +#define HB_VERSION_STRING "2.0.0" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \