[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.
This commit is contained in:
Garret Rieger 2021-12-14 16:24:38 -08:00 committed by Behdad Esfahbod
parent c4573c2ec7
commit 067f90a820
2 changed files with 7 additions and 3 deletions

View File

@ -128,7 +128,7 @@ struct hb_prune_langsys_context_t
bool visited (const T *p, hb_set_t &visited_set) bool visited (const T *p, hb_set_t &visited_set)
{ {
hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) p - (uintptr_t) table); 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; return true;
visited_set.add (delta); visited_set.add (delta);
@ -655,7 +655,6 @@ struct LangSys
void collect_features (hb_prune_langsys_context_t *c) const void collect_features (hb_prune_langsys_context_t *c) const
{ {
if (!has_required_feature () && !get_feature_count ()) return; if (!has_required_feature () && !get_feature_count ()) return;
if (c->visitedLangsys (this)) return;
if (has_required_feature () && if (has_required_feature () &&
c->duplicate_feature_map->has (reqFeatureIndex)) c->duplicate_feature_map->has (reqFeatureIndex))
c->new_feature_indexes->add (get_required_feature_index ()); c->new_feature_indexes->add (get_required_feature_index ());
@ -750,11 +749,15 @@ struct Script
{ {
//only collect features from non-redundant langsys //only collect features from non-redundant langsys
const LangSys& d = get_default_lang_sys (); 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))) for (auto _ : + hb_zip (langSys, hb_range (langsys_count)))
{ {
const LangSys& l = this+_.first.offset; const LangSys& l = this+_.first.offset;
if (c->visitedLangsys (&l)) continue;
if (l.compare (d, c->duplicate_feature_map)) continue; if (l.compare (d, c->duplicate_feature_map)) continue;
l.collect_features (c); l.collect_features (c);
@ -766,6 +769,7 @@ struct Script
for (auto _ : + hb_zip (langSys, hb_range (langsys_count))) for (auto _ : + hb_zip (langSys, hb_range (langsys_count)))
{ {
const LangSys& l = this+_.first.offset; const LangSys& l = this+_.first.offset;
if (c->visitedLangsys (&l)) continue;
l.collect_features (c); l.collect_features (c);
c->script_langsys_map->get (script_index)->add (_.second); c->script_langsys_map->get (script_index)->add (_.second);
} }