From 3c84aa8416cac7aba1430cc18ec76a393c47f3cd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 18 Jul 2022 13:57:59 -0600 Subject: [PATCH] [cff] Add a max work counter Set to 10,000 per interpretation right now. Fixes https://github.com/harfbuzz/harfbuzz/issues/3700 Fixes https://oss-fuzz.com/testcase-detail/5667125715927040 --- src/hb-cff-interp-cs-common.hh | 7 +++++++ ...case-minimized-hb-draw-fuzzer-5667125715927040 | Bin 0 -> 472 bytes test/fuzzing/hb-draw-fuzzer.cc | 1 + 3 files changed, 8 insertions(+) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5667125715927040 diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh index 2983ae54a..14abf3e80 100644 --- a/src/hb-cff-interp-cs-common.hh +++ b/src/hb-cff-interp-cs-common.hh @@ -57,6 +57,7 @@ struct call_context_t /* call stack */ const unsigned int kMaxCallLimit = 10; +const unsigned int kMaxOps = 10000; struct call_stack_t : cff_stack_t {}; template @@ -882,6 +883,11 @@ struct cs_interpreter_t : interpreter_t SUPER::env.set_endchar (false); for (;;) { + if (unlikely (!--max_ops)) + { + SUPER::env.set_error (); + break; + } OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param); if (unlikely (SUPER::env.in_error ())) return false; @@ -894,6 +900,7 @@ struct cs_interpreter_t : interpreter_t private: typedef interpreter_t SUPER; + unsigned max_ops = kMaxOps; }; } /* namespace CFF */ diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5667125715927040 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-draw-fuzzer-5667125715927040 new file mode 100644 index 0000000000000000000000000000000000000000..179122557804f69c9d42251f4bde5c06aa5c08bb GIT binary patch literal 472 zcmeYd3Grv(XR!Ir{J+52&CMvuF=h<|1H&Iq9)?o))hVU^L3-;Hud`fu@rz-fhvxiu zavZ^q46pv>-(~n4?HkD8aBor9K0)`CC+CLpCXV>TVmi%W2S static void _move_to (hb_draw_funcs_t *dfuncs, void *draw_data_, hb_draw_state_t *st,