[HarfBuzz] harfbuzz: Branch 'master' - 3 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Mon Nov 12 18:02:55 UTC 2018


 src/hb-aat-layout-kerx-table.hh                                                    |    2 
 src/hb-ot-shape.cc                                                                 |   26 +++++-----
 src/hb-ot-shape.hh                                                                 |   15 +++--
 src/hb-shape-plan.cc                                                               |   25 +++++----
 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152 |binary
 5 files changed, 36 insertions(+), 32 deletions(-)

New commits:
commit a549aa14a0b60436a16f7f8924a5b5f82b4d5b7e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 13:01:22 2018 -0500

    [kerx] Protect against stack underflow
    
    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11367

diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
index 6b61186a..4e6c6e40 100644
--- a/src/hb-aat-layout-kerx-table.hh
+++ b/src/hb-aat-layout-kerx-table.hh
@@ -260,7 +260,7 @@ struct KerxSubTableFormat1
 	  depth = 0; /* Probably not what CoreText does, but better? */
       }
 
-      if (Format1EntryT::performAction (entry))
+      if (depth && Format1EntryT::performAction (entry))
       {
 	unsigned int tuple_count = MAX (1u, table->header.tuple_count ());
 
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152
new file mode 100644
index 00000000..6c739000
Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152 differ
commit 3e284e02c2a5da758526360a45364a330b8ab8e9
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sun Nov 11 22:51:34 2018 -0500

    [shape-plan] Minor

diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 44cf3907..2500bcb8 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -68,11 +68,12 @@ _hb_apply_morx (hb_face_t *face)
 	 hb_aat_layout_has_substitution (face);
 }
 
-hb_ot_shape_planner_t::hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
-						face (master_plan->face_unsafe),
-						props (master_plan->props),
-						map (face, &props),
-						aat_map (face, &props),
+hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t                     *face,
+					      const hb_segment_properties_t *props) :
+						face (face),
+						props (*props),
+						map (face, props),
+						aat_map (face, props),
 						apply_morx (_hb_apply_morx (face)),
 						shaper (apply_morx ?
 						        &_hb_ot_complex_shaper_default :
@@ -148,18 +149,19 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
 }
 
 bool
-hb_ot_shape_plan_t::init0 (hb_shape_plan_t    *shape_plan,
-			   const hb_feature_t *user_features,
-			   unsigned int        num_user_features,
-			   const int          *coords,
-			   unsigned int        num_coords)
+hb_ot_shape_plan_t::init0 (hb_face_t                     *face,
+			   const hb_segment_properties_t *props,
+			   const hb_feature_t            *user_features,
+			   unsigned int                   num_user_features,
+			   const int                     *coords,
+			   unsigned int                   num_coords)
 {
   map.init ();
   aat_map.init ();
 
-  hb_ot_shape_planner_t planner (shape_plan);
+  hb_ot_shape_planner_t planner (face, props);
 
-  hb_ot_shape_collect_features (&planner, &shape_plan->props,
+  hb_ot_shape_collect_features (&planner, props,
 				user_features, num_user_features);
 
   planner.compile (*this, coords, num_coords);
diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh
index 049830a6..9753752a 100644
--- a/src/hb-ot-shape.hh
+++ b/src/hb-ot-shape.hh
@@ -73,12 +73,12 @@ struct hb_ot_shape_plan_t
   inline void substitute (hb_font_t *font, hb_buffer_t *buffer) const { map.substitute (this, font, buffer); }
   inline void position (hb_font_t *font, hb_buffer_t *buffer) const { map.position (this, font, buffer); }
 
-  HB_INTERNAL bool init0 (hb_shape_plan_t    *shape_plan,
-			  const hb_feature_t *user_features,
-			  unsigned int        num_user_features,
-			  const int          *coords,
-			  unsigned int        num_coords);
-
+  HB_INTERNAL bool init0 (hb_face_t                     *face,
+			  const hb_segment_properties_t *props,
+			  const hb_feature_t            *user_features,
+			  unsigned int                   num_user_features,
+			  const int                     *coords,
+			  unsigned int                   num_coords);
   HB_INTERNAL void fini (void);
 };
 
@@ -94,7 +94,8 @@ struct hb_ot_shape_planner_t
   bool apply_morx : 1;
   const struct hb_ot_complex_shaper_t *shaper;
 
-  HB_INTERNAL hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan);
+  HB_INTERNAL hb_ot_shape_planner_t (hb_face_t                     *face,
+				     const hb_segment_properties_t *props);
 
   HB_INTERNAL void compile (hb_ot_shape_plan_t &plan,
 			    const int          *coords,
diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc
index 534d2896..0d51165f 100644
--- a/src/hb-shape-plan.cc
+++ b/src/hb-shape-plan.cc
@@ -178,7 +178,8 @@ hb_shape_plan_create2 (hb_face_t                     *face,
 			       coords, num_coords,
 			       shaper_list);
 
-  if (unlikely (!shape_plan->ot.init0 (shape_plan,
+  if (unlikely (!shape_plan->ot.init0 (face,
+				       props,
 				       user_features,
 				       num_user_features,
 				       coords,
commit 420c9de6447cdb491184e7f8caf0811b0c962c05
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sun Nov 11 22:38:05 2018 -0500

    [shape-plan] Minor rename

diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc
index 2a2e0e39..534d2896 100644
--- a/src/hb-shape-plan.cc
+++ b/src/hb-shape-plan.cc
@@ -45,12 +45,12 @@
 
 
 static void
-hb_shape_plan_plan (hb_shape_plan_t    *shape_plan,
-		    const hb_feature_t *user_features,
-		    unsigned int        num_user_features,
-		    const int          *coords,
-		    unsigned int        num_coords,
-		    const char * const *shaper_list)
+hb_shape_plan_choose_shaper (hb_shape_plan_t    *shape_plan,
+			     const hb_feature_t *user_features,
+			     unsigned int        num_user_features,
+			     const int          *coords,
+			     unsigned int        num_coords,
+			     const char * const *shaper_list)
 {
   DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
 		  "num_features=%d num_coords=%d shaper_list=%p",
@@ -173,10 +173,10 @@ hb_shape_plan_create2 (hb_face_t                     *face,
   if (num_coords)
     memcpy (coords, orig_coords, num_coords * sizeof (int));
 
-  hb_shape_plan_plan (shape_plan,
-		      user_features, num_user_features,
-		      coords, num_coords,
-		      shaper_list);
+  hb_shape_plan_choose_shaper (shape_plan,
+			       user_features, num_user_features,
+			       coords, num_coords,
+			       shaper_list);
 
   if (unlikely (!shape_plan->ot.init0 (shape_plan,
 				       user_features,
@@ -487,7 +487,7 @@ hb_shape_plan_create_cached2 (hb_face_t                     *face,
   };
 
   if (shaper_list) {
-    /* Choose shaper.  Adapted from hb_shape_plan_plan().
+    /* Choose shaper.  Adapted from hb_shape_plan_choose_shaper().
      * Must choose shaper exactly the same way as that function. */
     for (const char * const *shaper_item = shaper_list; *shaper_item; shaper_item++)
       if (false)


More information about the HarfBuzz mailing list