From 09474d8d7b051b1465582828c8ec5afcccb6c3c6 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 29 Jun 2021 16:07:14 -0700 Subject: [PATCH] [subset] Fix fuzzer timeout in add_gid_and_children. The composite glyph graph isn't check for max operations by sanitize so track an operations count during the graph traversal. --- src/hb-ot-glyf-table.hh | 22 +++++++++++++----- ...inimized-hb-subset-fuzzer-5991762219892736 | Bin 0 -> 80599 bytes 2 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736 diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 229b59b9a..fa11a7fe9 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -45,6 +45,10 @@ namespace OT { */ #define HB_OT_TAG_loca HB_TAG('l','o','c','a') +#ifndef HB_MAX_COMPOSITE_OPERATIONS +#define HB_MAX_COMPOSITE_OPERATIONS 1000000 +#endif + struct loca { @@ -1079,18 +1083,24 @@ struct glyf return needs_padding_removal ? glyph.trim_padding () : glyph; } - void - add_gid_and_children (hb_codepoint_t gid, hb_set_t *gids_to_retain, - unsigned int depth = 0) const + unsigned + add_gid_and_children (hb_codepoint_t gid, + hb_set_t *gids_to_retain, + unsigned depth = 0, + unsigned operation_count = 0) const { - if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return; + if (unlikely (depth++ > HB_MAX_NESTING_LEVEL)) return operation_count; + if (unlikely (operation_count++ > HB_MAX_COMPOSITE_OPERATIONS)) return operation_count; /* Check if is already visited */ - if (gids_to_retain->has (gid)) return; + if (gids_to_retain->has (gid)) return operation_count; gids_to_retain->add (gid); for (auto &item : glyph_for_gid (gid).get_composite_iterator ()) - add_gid_and_children (item.get_glyph_index (), gids_to_retain, depth); + operation_count += + add_gid_and_children (item.get_glyph_index (), gids_to_retain, depth, operation_count); + + return operation_count; } #ifdef HB_EXPERIMENTAL_API diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5991762219892736 new file mode 100644 index 0000000000000000000000000000000000000000..de5d90e77ae343922c417d0218289ffb3f883c21 GIT binary patch literal 80599 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