From 067f90a82087a5feb1cf76625c54c60a10946fe1 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 14 Dec 2021 16:24:38 -0800 Subject: [PATCH] [subset] Fix for fuzzer timeout. Fixes https://oss-fuzz.com/testcase-detail/5549945449480192 In prune_langsys: move LangSys visited check up before any work is done for a LangSys. In this particular case the compare() method is responsible for the majority of the time spent and wasn't being guarded with a visisted check. --- src/hb-ot-layout-common.hh | 10 +++++++--- ...minimized-hb-subset-fuzzer-5549945449480192 | Bin 0 -> 562733 bytes 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192 diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 4fb189343..39d6e0ede 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -128,7 +128,7 @@ struct hb_prune_langsys_context_t bool visited (const T *p, hb_set_t &visited_set) { hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) p - (uintptr_t) table); - if (visited_set.has (delta)) + if (visited_set.in_error () || visited_set.has (delta)) return true; visited_set.add (delta); @@ -655,7 +655,6 @@ struct LangSys void collect_features (hb_prune_langsys_context_t *c) const { if (!has_required_feature () && !get_feature_count ()) return; - if (c->visitedLangsys (this)) return; if (has_required_feature () && c->duplicate_feature_map->has (reqFeatureIndex)) c->new_feature_indexes->add (get_required_feature_index ()); @@ -750,11 +749,15 @@ struct Script { //only collect features from non-redundant langsys const LangSys& d = get_default_lang_sys (); - d.collect_features (c); + if (!c->visitedLangsys (&d)) { + d.collect_features (c); + } for (auto _ : + hb_zip (langSys, hb_range (langsys_count))) { + const LangSys& l = this+_.first.offset; + if (c->visitedLangsys (&l)) continue; if (l.compare (d, c->duplicate_feature_map)) continue; l.collect_features (c); @@ -766,6 +769,7 @@ struct Script for (auto _ : + hb_zip (langSys, hb_range (langsys_count))) { const LangSys& l = this+_.first.offset; + if (c->visitedLangsys (&l)) continue; l.collect_features (c); c->script_langsys_map->get (script_index)->add (_.second); } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5549945449480192 new file mode 100644 index 0000000000000000000000000000000000000000..62072f1778cb735a1a2777ad04dd2d8c9652348c GIT binary patch literal 562733 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