[repacker] fix fuzzer timeout.

For https://oss-fuzz.com/testcase-detail/5845846876356608. Only process the set of unique overflows.
This commit is contained in:
Garret Rieger 2022-11-21 23:20:59 +00:00 committed by Behdad Esfahbod
parent 59451502e9
commit dd1ba328a8
2 changed files with 21 additions and 0 deletions

View File

@ -33,6 +33,23 @@ struct overflow_record_t
{ {
unsigned parent; unsigned parent;
unsigned child; unsigned child;
bool operator != (const overflow_record_t o) const
{ return !(*this == o); }
inline bool operator == (const overflow_record_t& o) const
{
return parent == o.parent &&
child == o.child;
}
inline uint32_t hash () const
{
uint32_t current = 0;
current = current * 31 + hb_hash (parent);
current = current * 31 + hb_hash (child);
return current;
}
}; };
inline inline
@ -94,6 +111,7 @@ will_overflow (graph_t& graph,
if (overflows) overflows->resize (0); if (overflows) overflows->resize (0);
graph.update_positions (); graph.update_positions ();
hb_hashmap_t<overflow_record_t*, bool> record_set;
const auto& vertices = graph.vertices_; const auto& vertices = graph.vertices_;
for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--) for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--)
{ {
@ -109,7 +127,10 @@ will_overflow (graph_t& graph,
overflow_record_t r; overflow_record_t r;
r.parent = parent_idx; r.parent = parent_idx;
r.child = link.objidx; r.child = link.objidx;
if (record_set.has(&r)) continue; // don't keep duplicate overflows.
overflows->push (r); overflows->push (r);
record_set.set(&r, true);
} }
} }