From c68a00b92eb62fdc79f9a2bd1fc7a6acc24a3602 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 27 Jul 2021 13:25:22 -0600 Subject: [PATCH] [subset] Fix possible overflows in VarRegionList serialize Fixes https://oss-fuzz.com/testcase-detail/5362189182566400 --- src/harfbuzz.cc | 1 + src/hb-ot-layout-common.hh | 7 +++++-- ...-minimized-hb-subset-fuzzer-5362189182566400 | Bin 0 -> 85171 bytes 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400 diff --git a/src/harfbuzz.cc b/src/harfbuzz.cc index fe0010097..14ee6f5e8 100644 --- a/src/harfbuzz.cc +++ b/src/harfbuzz.cc @@ -9,6 +9,7 @@ #include "hb-fallback-shape.cc" #include "hb-font.cc" #include "hb-map.cc" +#include "hb-ms-feature-ranges.cc" #include "hb-number.cc" #include "hb-ot-cff1-table.cc" #include "hb-ot-cff2-table.cc" diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 5da487dd2..0b7878c77 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2517,7 +2517,8 @@ struct VarRegionList { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - axesZ.sanitize (c, (unsigned int) axisCount * (unsigned int) regionCount)); + !hb_unsigned_mul_overflows (axisCount * regionCount, VarRegionAxis::static_size) && + axesZ.sanitize (c, axisCount * regionCount)); } bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_bimap_t ®ion_map) @@ -2527,7 +2528,9 @@ struct VarRegionList if (unlikely (!out)) return_trace (false); axisCount = src->axisCount; regionCount = region_map.get_population (); - if (unlikely (!c->allocate_size (get_size () - min_size))) return_trace (false); + if (unlikely (hb_unsigned_mul_overflows (axisCount * regionCount, + VarRegionAxis::static_size))) return_trace (false); + if (unlikely (!c->extend (out))) return_trace (false); unsigned int region_count = src->get_region_count (); for (unsigned int r = 0; r < regionCount; r++) { diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5362189182566400 new file mode 100644 index 0000000000000000000000000000000000000000..fb1b22670e48bc0659eec1f287eba792bb160799 GIT binary patch literal 85171 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 OmIBe4?bG>4XZ9bxf*RZa literal 0 HcmV?d00001