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

Behdad Esfahbod behdad at kemper.freedesktop.org
Thu Sep 13 17:27:01 UTC 2018


 src/hb-dsalgs.hh        |   14 +--
 src/hb-open-file.hh     |  214 +++++++++++++++++++++---------------------------
 src/hb-open-type.hh     |   81 +++++++++++-------
 src/hb-ot-post-table.hh |    2 
 4 files changed, 157 insertions(+), 154 deletions(-)

New commits:
commit 180a88a96ce327e4103df3635c73559de65d1546
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 19:19:57 2018 +0200

    [dfont] Some more

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 89b76d82..5c653fed 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -322,7 +322,8 @@ struct ResourceRecord
 
 struct ResourceTypeRecord
 {
-  inline unsigned int get_resource_count (void) const { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
+  inline unsigned int get_resource_count (void) const
+  { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
 
   inline bool is_sfnt (void) const { return tag == HB_TAG_sfnt; }
 
@@ -363,14 +364,6 @@ struct ResourceMap
 					   get_type_count ()) [i];
   }
 
-  inline unsigned int get_type_count (void) const { return typeCountM1 + 1; }
-
-  inline const ResourceRecord &get_resource_record (const ResourceTypeRecord &type,
-						    unsigned int i) const
-  {
-    return type.get_resource_record (i, &(this+typeListZ));
-  }
-
   inline unsigned int get_face_count (void) const
   {
     unsigned int count = get_type_count ();
@@ -390,11 +383,10 @@ struct ResourceMap
     for (unsigned int i = 0; i < count; i++)
     {
       const ResourceTypeRecord& type = get_type_record (i);
+      /* The check for idx < count is here because ResourceRecord is NOT null-safe.
+       * Because an offset of 0 there does NOT mean null. */
       if (type.is_sfnt () && idx < type.get_resource_count ())
-      {
-	const OpenTypeFontFace &face = get_resource_record (type, idx).get_face (data_base);
-	return face;
-      }
+	return type.get_resource_record (idx, &(this+typeListZ)).get_face (data_base);
     }
     return Null (OpenTypeFontFace);
   }
@@ -410,6 +402,9 @@ struct ResourceMap
 				      data_base));
   }
 
+  private:
+  inline unsigned int get_type_count (void) const { return typeCountM1 + 1; }
+
   protected:
   HBUINT8	reserved0[16];	/* Reserved for copy of resource header */
   HBUINT32	reserved1;	/* Reserved for handle to next resource map */
commit 0ab0f1e5ac5ccb07c57364e9f5be0b991398eb6f
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 19:13:01 2018 +0200

    [dfont] Push methods further down

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 0c669119..89b76d82 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -371,6 +371,34 @@ struct ResourceMap
     return type.get_resource_record (i, &(this+typeListZ));
   }
 
+  inline unsigned int get_face_count (void) const
+  {
+    unsigned int count = get_type_count ();
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const ResourceTypeRecord& type = get_type_record (i);
+      if (type.is_sfnt ())
+	return type.get_resource_count ();
+    }
+    return 0;
+  }
+
+  inline const OpenTypeFontFace& get_face (unsigned int idx,
+					   const void *data_base) const
+  {
+    unsigned int count = get_type_count ();
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const ResourceTypeRecord& type = get_type_record (i);
+      if (type.is_sfnt () && idx < type.get_resource_count ())
+      {
+	const OpenTypeFontFace &face = get_resource_record (type, idx).get_face (data_base);
+	return face;
+      }
+    }
+    return Null (OpenTypeFontFace);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c, const void *data_base) const
   {
     TRACE_SANITIZE (this);
@@ -400,35 +428,15 @@ struct ResourceMap
 struct ResourceForkHeader
 {
   inline unsigned int get_face_count (void) const
-  {
-    const ResourceMap &resource_map = this+map;
-    unsigned int count = resource_map.get_type_count ();
-    for (unsigned int i = 0; i < count; i++)
-    {
-      const ResourceTypeRecord& type = resource_map.get_type_record (i);
-      if (type.is_sfnt ())
-	return type.get_resource_count ();
-    }
-    return 0;
-  }
+  { return (this+map).get_face_count (); }
 
   inline const OpenTypeFontFace& get_face (unsigned int idx,
 					   unsigned int *base_offset = nullptr) const
   {
-    const ResourceMap &resource_map = this+map;
-    unsigned int count = resource_map.get_type_count ();
-    for (unsigned int i = 0; i < count; i++)
-    {
-      const ResourceTypeRecord& type = resource_map.get_type_record (i);
-      if (type.is_sfnt () && idx < type.get_resource_count ())
-      {
-	const OpenTypeFontFace &face = resource_map.get_resource_record (type, idx).get_face (&(this+data));
-	if (base_offset)
-	  *base_offset = (const char *) &face - (const char *) this;
-	return face;
-      }
-    }
-    return Null (OpenTypeFontFace);
+    const OpenTypeFontFace &face = (this+map).get_face (idx, &(this+data));
+    if (base_offset)
+      *base_offset = (const char *) &face - (const char *) this;
+    return face;
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
commit 8c9bdcc1feeab321a642bdaac50b716e48ce4263
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 19:08:22 2018 +0200

    [dfont] Minor

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index ce39bfc9..0c669119 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -322,9 +322,9 @@ struct ResourceRecord
 
 struct ResourceTypeRecord
 {
-  inline unsigned int get_resource_count () const { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
+  inline unsigned int get_resource_count (void) const { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
 
-  inline bool is_sfnt () const { return tag == HB_TAG_sfnt; }
+  inline bool is_sfnt (void) const { return tag == HB_TAG_sfnt; }
 
   inline const ResourceRecord& get_resource_record (unsigned int i,
 						    const void *type_base) const
@@ -363,7 +363,7 @@ struct ResourceMap
 					   get_type_count ()) [i];
   }
 
-  inline unsigned int get_type_count () const { return typeCountM1 + 1; }
+  inline unsigned int get_type_count (void) const { return typeCountM1 + 1; }
 
   inline const ResourceRecord &get_resource_record (const ResourceTypeRecord &type,
 						    unsigned int i) const
@@ -399,7 +399,7 @@ struct ResourceMap
 
 struct ResourceForkHeader
 {
-  inline unsigned int get_face_count () const
+  inline unsigned int get_face_count (void) const
   {
     const ResourceMap &resource_map = this+map;
     unsigned int count = resource_map.get_type_count ();
commit 4479d3a2eda57d278700f5c78414ef6ef617d2a9
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 19:05:59 2018 +0200

    [dfon]t Sanitize OpenTypeFontFace

diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh
index 692002e9..eb15c089 100644
--- a/src/hb-dsalgs.hh
+++ b/src/hb-dsalgs.hh
@@ -537,12 +537,6 @@ struct hb_bytes_t
 
   inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
 
-  template <typename Type>
-  inline const Type* as (void) const
-  {
-    return unlikely (!arrayZ) ? &Null(Type) : reinterpret_cast<const Type *> (arrayZ);
-  }
-
   inline int cmp (const hb_bytes_t &a) const
   {
     if (len != a.len)
diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 92dca3f8..ce39bfc9 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -293,15 +293,16 @@ struct TTCHeader
 
 struct ResourceRecord
 {
-  inline const hb_bytes_t get_data (const void *data_base) const
-  { return hb_bytes_t (data_base+offset); }
+  inline const OpenTypeFontFace & get_face (const void *data_base) const
+  { return CastR<OpenTypeFontFace> ((data_base+offset).arrayZ); }
 
   inline bool sanitize (hb_sanitize_context_t *c,
 			const void *data_base) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
-		  offset.sanitize (c, data_base));
+		  offset.sanitize (c, data_base) &&
+		  get_face (data_base).sanitize (c));
   }
 
   protected:
@@ -317,11 +318,13 @@ struct ResourceRecord
   DEFINE_SIZE_STATIC (12);
 };
 
+#define HB_TAG_sfnt HB_TAG ('s','f','n','t')
+
 struct ResourceTypeRecord
 {
-  inline unsigned int get_resource_count () const { return resCountM1 + 1; }
+  inline unsigned int get_resource_count () const { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
 
-  inline bool is_sfnt () const { return tag == HB_TAG ('s','f','n','t'); }
+  inline bool is_sfnt () const { return tag == HB_TAG_sfnt; }
 
   inline const ResourceRecord& get_resource_record (unsigned int i,
 						    const void *type_base) const
@@ -409,10 +412,6 @@ struct ResourceForkHeader
     return 0;
   }
 
-  inline const hb_bytes_t get_data (const ResourceTypeRecord& type,
-				    unsigned int idx) const
-  { return (this+map).get_resource_record (type, idx).get_data (&(this+data)); }
-
   inline const OpenTypeFontFace& get_face (unsigned int idx,
 					   unsigned int *base_offset = nullptr) const
   {
@@ -423,7 +422,7 @@ struct ResourceForkHeader
       const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt () && idx < type.get_resource_count ())
       {
-	const OpenTypeFontFace &face = *get_data (type, idx).as<OpenTypeFontFace> ();
+	const OpenTypeFontFace &face = resource_map.get_resource_record (type, idx).get_face (&(this+data));
 	if (base_offset)
 	  *base_offset = (const char *) &face - (const char *) this;
 	return face;
@@ -437,8 +436,6 @@ struct ResourceForkHeader
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
 		  map.sanitize (c, this, &(this+data)));
-
-    // XXX Sanitize OpenTypeFontFace's
   }
 
   protected:
commit 3fba41906fba28c5ea01cc0749654de862453bf4
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 18:49:16 2018 +0200

    [dfont] Minor

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index b960d62d..92dca3f8 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -411,17 +411,14 @@ struct ResourceForkHeader
 
   inline const hb_bytes_t get_data (const ResourceTypeRecord& type,
 				    unsigned int idx) const
-  {
-    const ResourceMap &resource_map = this+map;
-    const void *data_base = &(this+data);
-    return resource_map.get_resource_record (type, idx).get_data (data_base);
-  }
+  { return (this+map).get_resource_record (type, idx).get_data (&(this+data)); }
 
   inline const OpenTypeFontFace& get_face (unsigned int idx,
 					   unsigned int *base_offset = nullptr) const
   {
     const ResourceMap &resource_map = this+map;
-    for (unsigned int i = 0; i < resource_map.get_type_count (); i++)
+    unsigned int count = resource_map.get_type_count ();
+    for (unsigned int i = 0; i < count; i++)
     {
       const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt () && idx < type.get_resource_count ())
commit bf852f0e62a8bdbb809af6a975f8ae8eed708d70
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 18:47:53 2018 +0200

    [dfont] Make test pass
    
    Offset 0 is not null in this context.

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index d3e87225..b960d62d 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -309,7 +309,7 @@ struct ResourceRecord
   HBINT16	nameOffset;	/* Offset from beginning of resource name list
 				 * to resource name, -1 means there is none. */
   HBUINT8	attrs;		/* Resource attributes */
-  OffsetTo<LArrayOf<HBUINT8>, HBUINT24>
+  OffsetTo<LArrayOf<HBUINT8>, HBUINT24, false>
 		offset;		/* Offset from beginning of data block to
 				 * data for this resource */
   HBUINT32	reserved;	/* Reserved for handle to resource */
commit 29faebe911a13916aa3d737e93d38deedc53567f
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 18:45:35 2018 +0200

    Allow Offset<>'s that have no 0==null

diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 973dc5e1..b10d33b1 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -155,10 +155,10 @@ struct Index : HBUINT16 {
 DECLARE_NULL_NAMESPACE_BYTES (OT, Index);
 
 /* Offset, Null offset = 0 */
-template <typename Type>
+template <typename Type, bool has_null=true>
 struct Offset : Type
 {
-  inline bool is_null (void) const { return 0 == *this; }
+  inline bool is_null (void) const { return has_null && 0 == *this; }
 
   inline void *serialize (hb_serialize_context_t *c, const void *base)
   {
@@ -226,20 +226,18 @@ struct FixedVersion
  * Use: (base+offset)
  */
 
-template <typename Type, typename OffsetType=HBUINT16>
-struct OffsetTo : Offset<OffsetType>
+template <typename Type, typename OffsetType=HBUINT16, bool has_null=true>
+struct OffsetTo : Offset<OffsetType, has_null>
 {
   inline const Type& operator () (const void *base) const
   {
-    unsigned int offset = *this;
-    if (unlikely (!offset)) return Null(Type);
-    return StructAtOffset<const Type> (base, offset);
+    if (unlikely (this->is_null ())) return Null(Type);
+    return StructAtOffset<const Type> (base, *this);
   }
   inline Type& operator () (void *base) const
   {
-    unsigned int offset = *this;
-    if (unlikely (!offset)) return Crap(Type);
-    return StructAtOffset<Type> (base, offset);
+    if (unlikely (this->is_null ())) return Crap(Type);
+    return StructAtOffset<Type> (base, *this);
   }
 
   inline Type& serialize (hb_serialize_context_t *c, const void *base)
@@ -264,9 +262,8 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return_trace (false);
-    unsigned int offset = *this;
-    if (unlikely (!offset)) return_trace (true);
-    if (unlikely (!c->check_range (base, offset))) return_trace (false);
+    if (unlikely (this->is_null ())) return_trace (true);
+    if (unlikely (!c->check_range (base, *this))) return_trace (false);
     return_trace (true);
   }
 
@@ -274,7 +271,7 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (!*this ||
+		  (this->is_null () ||
 		   StructAtOffset<Type> (base, *this).sanitize (c) ||
 		   neuter (c)));
   }
@@ -283,7 +280,7 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (!*this ||
+		  (this->is_null () ||
 		   StructAtOffset<Type> (base, *this).sanitize (c, d1) ||
 		   neuter (c)));
   }
@@ -292,7 +289,7 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (!*this ||
+		  (this->is_null () ||
 		   StructAtOffset<Type> (base, *this).sanitize (c, d1, d2) ||
 		   neuter (c)));
   }
@@ -301,22 +298,24 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (!*this ||
+		  (this->is_null () ||
 		   StructAtOffset<Type> (base, *this).sanitize (c, d1, d2, d3) ||
 		   neuter (c)));
   }
 
   /* Set the offset to Null */
-  inline bool neuter (hb_sanitize_context_t *c) const {
+  inline bool neuter (hb_sanitize_context_t *c) const
+  {
+    if (!has_null) return false;
     return c->try_set (this, 0);
   }
   DEFINE_SIZE_STATIC (sizeof(OffsetType));
 };
 template <typename Type> struct LOffsetTo : OffsetTo<Type, HBUINT32> {};
-template <typename Base, typename OffsetType, typename Type>
-static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); }
-template <typename Base, typename OffsetType, typename Type>
-static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType> &offset) { return offset (base); }
+template <typename Base, typename OffsetType, bool has_null, typename Type>
+static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
+template <typename Base, typename OffsetType, bool has_null, typename Type>
+static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
 
 
 /*
commit 82f4d776c21b7c1224dd7073ce69cdf76d85f16b
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 18:27:20 2018 +0200

    [dfont] Minor

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 5cff0806..d3e87225 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -305,7 +305,7 @@ struct ResourceRecord
   }
 
   protected:
-  HBUINT16	id;		/* Resource ID, is really should be signed? */
+  HBUINT16	id;		/* Resource ID. */
   HBINT16	nameOffset;	/* Offset from beginning of resource name list
 				 * to resource name, -1 means there is none. */
   HBUINT8	attrs;		/* Resource attributes */
@@ -400,7 +400,7 @@ struct ResourceForkHeader
   {
     const ResourceMap &resource_map = this+map;
     unsigned int count = resource_map.get_type_count ();
-    for (unsigned int i = 0; i < count; ++i)
+    for (unsigned int i = 0; i < count; i++)
     {
       const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt ())
@@ -421,7 +421,7 @@ struct ResourceForkHeader
 					   unsigned int *base_offset = nullptr) const
   {
     const ResourceMap &resource_map = this+map;
-    for (unsigned int i = 0; i < resource_map.get_type_count (); ++i)
+    for (unsigned int i = 0; i < resource_map.get_type_count (); i++)
     {
       const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt () && idx < type.get_resource_count ())
commit 07e0ca930c29757217c2f9e4e0e6954657b6b82d
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 17:39:09 2018 +0200

    [bytes] Rename content to arrayZ

diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh
index 26e8e42a..692002e9 100644
--- a/src/hb-dsalgs.hh
+++ b/src/hb-dsalgs.hh
@@ -529,18 +529,18 @@ struct hb_array_t
 
 struct hb_bytes_t
 {
-  inline hb_bytes_t (void) : bytes (nullptr), len (0) {}
-  inline hb_bytes_t (const char *bytes_, unsigned int len_) : bytes (bytes_), len (len_) {}
-  inline hb_bytes_t (const void *bytes_, unsigned int len_) : bytes ((const char *) bytes_), len (len_) {}
+  inline hb_bytes_t (void) : arrayZ (nullptr), len (0) {}
+  inline hb_bytes_t (const char *bytes_, unsigned int len_) : arrayZ (bytes_), len (len_) {}
+  inline hb_bytes_t (const void *bytes_, unsigned int len_) : arrayZ ((const char *) bytes_), len (len_) {}
   template <typename T>
-  inline hb_bytes_t (const T& array) : bytes ((const char *) array.arrayZ), len (array.len) {}
+  inline hb_bytes_t (const T& array) : arrayZ ((const char *) array.arrayZ), len (array.len) {}
 
-  inline void free (void) { ::free ((void *) bytes); bytes = nullptr; len = 0; }
+  inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
 
   template <typename Type>
   inline const Type* as (void) const
   {
-    return unlikely (!bytes) ? &Null(Type) : reinterpret_cast<const Type *> (bytes);
+    return unlikely (!arrayZ) ? &Null(Type) : reinterpret_cast<const Type *> (arrayZ);
   }
 
   inline int cmp (const hb_bytes_t &a) const
@@ -548,7 +548,7 @@ struct hb_bytes_t
     if (len != a.len)
       return (int) a.len - (int) len;
 
-    return memcmp (a.bytes, bytes, len);
+    return memcmp (a.arrayZ, arrayZ, len);
   }
   static inline int cmp (const void *pa, const void *pb)
   {
@@ -557,7 +557,7 @@ struct hb_bytes_t
     return b->cmp (*a);
   }
 
-  const char *bytes;
+  const char *arrayZ;
   unsigned int len;
 };
 
diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh
index 29dc86fa..5f27fd50 100644
--- a/src/hb-ot-post-table.hh
+++ b/src/hb-ot-post-table.hh
@@ -143,7 +143,7 @@ struct post
 	return true;
       if (buf_len <= s.len) /* What to do with truncation? Returning false for now. */
         return false;
-      strncpy (buf, s.bytes, s.len);
+      strncpy (buf, s.arrayZ, s.len);
       buf[s.len] = '\0';
       return true;
     }
commit dbb764dceb61365b7360a48d581ba5a4b3526e98
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 16:49:26 2018 +0200

    [dfont] Clean up sanitize()
    
    I don't think I broke anything.  Fuzzers will let me know..

diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh
index def968eb..26e8e42a 100644
--- a/src/hb-dsalgs.hh
+++ b/src/hb-dsalgs.hh
@@ -532,9 +532,17 @@ struct hb_bytes_t
   inline hb_bytes_t (void) : bytes (nullptr), len (0) {}
   inline hb_bytes_t (const char *bytes_, unsigned int len_) : bytes (bytes_), len (len_) {}
   inline hb_bytes_t (const void *bytes_, unsigned int len_) : bytes ((const char *) bytes_), len (len_) {}
+  template <typename T>
+  inline hb_bytes_t (const T& array) : bytes ((const char *) array.arrayZ), len (array.len) {}
 
   inline void free (void) { ::free ((void *) bytes); bytes = nullptr; len = 0; }
 
+  template <typename Type>
+  inline const Type* as (void) const
+  {
+    return unlikely (!bytes) ? &Null(Type) : reinterpret_cast<const Type *> (bytes);
+  }
+
   inline int cmp (const hb_bytes_t &a) const
   {
     if (len != a.len)
diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 26e68bb5..5cff0806 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -293,18 +293,24 @@ struct TTCHeader
 
 struct ResourceRecord
 {
-  inline bool sanitize (hb_sanitize_context_t *c) const
+  inline const hb_bytes_t get_data (const void *data_base) const
+  { return hb_bytes_t (data_base+offset); }
+
+  inline bool sanitize (hb_sanitize_context_t *c,
+			const void *data_base) const
   {
     TRACE_SANITIZE (this);
-    // actual data sanitization is done on ResourceForkHeader sanitizer
-    return_trace (likely (c->check_struct (this)));
+    return_trace (c->check_struct (this) &&
+		  offset.sanitize (c, data_base));
   }
 
+  protected:
   HBUINT16	id;		/* Resource ID, is really should be signed? */
   HBINT16	nameOffset;	/* Offset from beginning of resource name list
 				 * to resource name, -1 means there is none. */
   HBUINT8	attrs;		/* Resource attributes */
-  HBUINT24	dataOffset;	/* Offset from beginning of resource data to
+  OffsetTo<LArrayOf<HBUINT8>, HBUINT24>
+		offset;		/* Offset from beginning of data block to
 				 * data for this resource */
   HBUINT32	reserved;	/* Reserved for handle to resource */
   public:
@@ -313,28 +319,33 @@ struct ResourceRecord
 
 struct ResourceTypeRecord
 {
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    // RefList sanitization is done on ResourceMap sanitizer
-    return_trace (likely (c->check_struct (this)));
-  }
-
   inline unsigned int get_resource_count () const { return resCountM1 + 1; }
 
   inline bool is_sfnt () const { return tag == HB_TAG ('s','f','n','t'); }
 
-  inline const ResourceRecord& get_resource_record (const void *base,
-						    unsigned int i) const
+  inline const ResourceRecord& get_resource_record (unsigned int i,
+						    const void *type_base) const
   {
-    return (base+refList)[i];
+    return hb_array_t<ResourceRecord> ((type_base+resourcesZ).arrayZ,
+				       get_resource_count ()) [i];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c,
+			const void *type_base,
+			const void *data_base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  resourcesZ.sanitize (c, type_base,
+				       get_resource_count (),
+				       data_base));
   }
 
   protected:
   Tag		tag;		/* Resource type. */
   HBUINT16	resCountM1;	/* Number of resources minus 1. */
   OffsetTo<UnsizedArrayOf<ResourceRecord> >
-		refList;	/* Offset from beginning of resource type list
+		resourcesZ;	/* Offset from beginning of resource type list
 				 * to reference item list for this type. */
   public:
   DEFINE_SIZE_STATIC (8);
@@ -342,35 +353,30 @@ struct ResourceTypeRecord
 
 struct ResourceMap
 {
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this)))
-      return_trace (false);
-    for (unsigned int i = 0; i < get_types_count (); ++i)
-    {
-      const ResourceTypeRecord& type = get_type_record (i);
-      if (unlikely (!type.sanitize (c)))
-        return_trace (false);
-      for (unsigned int j = 0; j < type.get_resource_count (); ++j)
-	if (unlikely (!get_resource_record (type, j).sanitize (c)))
-	  return_trace (false);
-    }
-    return_trace (true);
-  }
-
   inline const ResourceTypeRecord& get_type_record (unsigned int i) const
   {
     // Why offset from the third byte of the object? I'm not sure
-    return (((const char *) this + 2)+typeListZ)[i];
+    return hb_array_t<ResourceTypeRecord> (((2 + (const char *) this )+typeListZ).arrayZ,
+					   get_type_count ()) [i];
   }
 
-  inline unsigned int get_types_count () const { return typeCountM1 + 1; }
+  inline unsigned int get_type_count () const { return typeCountM1 + 1; }
 
   inline const ResourceRecord &get_resource_record (const ResourceTypeRecord &type,
 						    unsigned int i) const
   {
-    return type.get_resource_record (&(this+typeListZ), i);
+    return type.get_resource_record (i, &(this+typeListZ));
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *data_base) const
+  {
+    TRACE_SANITIZE (this);
+    const void *type_base = &(this+typeListZ);
+    return_trace (c->check_struct (this) &&
+		  typeListZ.sanitize (c, 2 + (const char *) this,
+				      get_type_count (),
+				      type_base,
+				      data_base));
   }
 
   protected:
@@ -393,7 +399,8 @@ struct ResourceForkHeader
   inline unsigned int get_face_count () const
   {
     const ResourceMap &resource_map = this+map;
-    for (unsigned int i = 0; i < resource_map.get_types_count (); ++i)
+    unsigned int count = resource_map.get_type_count ();
+    for (unsigned int i = 0; i < count; ++i)
     {
       const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt ())
@@ -402,23 +409,24 @@ struct ResourceForkHeader
     return 0;
   }
 
-  inline const LArrayOf<HBUINT8>& get_data (const ResourceTypeRecord& type,
-					    unsigned int idx) const
+  inline const hb_bytes_t get_data (const ResourceTypeRecord& type,
+				    unsigned int idx) const
   {
     const ResourceMap &resource_map = this+map;
-    unsigned int offset = dataOffset + resource_map.get_resource_record (type, idx).dataOffset;
-    return StructAtOffset<LArrayOf<HBUINT8> > (this, offset);
+    const void *data_base = &(this+data);
+    return resource_map.get_resource_record (type, idx).get_data (data_base);
   }
 
-  inline const OpenTypeFontFace& get_face (unsigned int idx, unsigned int *base_offset = nullptr) const
+  inline const OpenTypeFontFace& get_face (unsigned int idx,
+					   unsigned int *base_offset = nullptr) const
   {
     const ResourceMap &resource_map = this+map;
-    for (unsigned int i = 0; i < resource_map.get_types_count (); ++i)
+    for (unsigned int i = 0; i < resource_map.get_type_count (); ++i)
     {
       const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt () && idx < type.get_resource_count ())
       {
-	const OpenTypeFontFace &face = (OpenTypeFontFace&) get_data (type, idx).arrayZ;
+	const OpenTypeFontFace &face = *get_data (type, idx).as<OpenTypeFontFace> ();
 	if (base_offset)
 	  *base_offset = (const char *) &face - (const char *) this;
 	return face;
@@ -430,33 +438,15 @@ struct ResourceForkHeader
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this)))
-      return_trace (false);
-
-    const ResourceMap &resource_map = this+map;
-    if (unlikely (!resource_map.sanitize (c)))
-      return_trace (false);
+    return_trace (c->check_struct (this) &&
+		  map.sanitize (c, this, &(this+data)));
 
-    for (unsigned int i = 0; i < resource_map.get_types_count (); ++i)
-    {
-      const ResourceTypeRecord& type = resource_map.get_type_record (i);
-      for (unsigned int j = 0; j < type.get_resource_count (); ++j)
-      {
-        const LArrayOf<HBUINT8>& data = get_data (type, j);
-	if (unlikely (!data.sanitize (c)))
-	  return_trace (false);
-
-	if (unlikely (type.is_sfnt () &&
-		      !((OpenTypeFontFace&) data.arrayZ).sanitize (c)))
-	  return_trace (false);
-      }
-    }
-
-    return_trace (true);
+    // XXX Sanitize OpenTypeFontFace's
   }
 
   protected:
-  Offset32	dataOffset;	/* Offset from beginning of resource fork
+  LOffsetTo<UnsizedArrayOf<HBUINT8> >
+		data;		/* Offset from beginning of resource fork
 				 * to resource data */
   LOffsetTo<ResourceMap>
 		map;		/* Offset from beginning of resource fork
commit 361fc2686152ad8c0ebaf19e0522e0fc58ba3953
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 16:47:33 2018 +0200

    Fix OffsetTo::sanitize() after reshuffling

diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 3926694b..973dc5e1 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -274,7 +274,8 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (StructAtOffset<Type> (base, *this).sanitize (c) ||
+		  (!*this ||
+		   StructAtOffset<Type> (base, *this).sanitize (c) ||
 		   neuter (c)));
   }
   template <typename T1>
@@ -282,7 +283,8 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (StructAtOffset<Type> (base, *this).sanitize (c, d1) ||
+		  (!*this ||
+		   StructAtOffset<Type> (base, *this).sanitize (c, d1) ||
 		   neuter (c)));
   }
   template <typename T1, typename T2>
@@ -290,7 +292,8 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (StructAtOffset<Type> (base, *this).sanitize (c, d1, d2) ||
+		  (!*this ||
+		   StructAtOffset<Type> (base, *this).sanitize (c, d1, d2) ||
 		   neuter (c)));
   }
   template <typename T1, typename T2, typename T3>
@@ -298,7 +301,8 @@ struct OffsetTo : Offset<OffsetType>
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (StructAtOffset<Type> (base, *this).sanitize (c, d1, d2, d3) ||
+		  (!*this ||
+		   StructAtOffset<Type> (base, *this).sanitize (c, d1, d2, d3) ||
 		   neuter (c)));
   }
 
commit 4c6b0fb5f6668a6e562260d16f629ad3c41e8961
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 16:39:30 2018 +0200

    OffsetTo::sanitize() Add version with three user_data

diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 76ce55a7..3926694b 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -277,20 +277,28 @@ struct OffsetTo : Offset<OffsetType>
 		  (StructAtOffset<Type> (base, *this).sanitize (c) ||
 		   neuter (c)));
   }
-  template <typename T>
-  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
+  template <typename T1>
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1) const
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (StructAtOffset<Type> (base, *this).sanitize (c, user_data) ||
+		  (StructAtOffset<Type> (base, *this).sanitize (c, d1) ||
 		   neuter (c)));
   }
   template <typename T1, typename T2>
-  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T1 user_data1, T2 user_data2) const
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (sanitize_shallow (c, base) &&
+		  (StructAtOffset<Type> (base, *this).sanitize (c, d1, d2) ||
+		   neuter (c)));
+  }
+  template <typename T1, typename T2, typename T3>
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2, T3 d3) const
   {
     TRACE_SANITIZE (this);
     return_trace (sanitize_shallow (c, base) &&
-		  (StructAtOffset<Type> (base, *this).sanitize (c, user_data1, user_data2) ||
+		  (StructAtOffset<Type> (base, *this).sanitize (c, d1, d2, d3) ||
 		   neuter (c)));
   }
 
commit a73bea69c599787b4cfeac92a3afd00749e00434
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 16:31:31 2018 +0200

    OffsetTo::sanitize() more shuffling

diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 2c71f819..76ce55a7 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -273,25 +273,25 @@ struct OffsetTo : Offset<OffsetType>
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!sanitize_shallow (c, base))) return_trace (false);
-    const Type &obj = StructAtOffset<Type> (base, *this);
-    return_trace (likely (obj.sanitize (c)) || neuter (c));
+    return_trace (sanitize_shallow (c, base) &&
+		  (StructAtOffset<Type> (base, *this).sanitize (c) ||
+		   neuter (c)));
   }
   template <typename T>
   inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!sanitize_shallow (c, base))) return_trace (false);
-    const Type &obj = StructAtOffset<Type> (base, *this);
-    return_trace (likely (obj.sanitize (c, user_data)) || neuter (c));
+    return_trace (sanitize_shallow (c, base) &&
+		  (StructAtOffset<Type> (base, *this).sanitize (c, user_data) ||
+		   neuter (c)));
   }
   template <typename T1, typename T2>
   inline bool sanitize (hb_sanitize_context_t *c, const void *base, T1 user_data1, T2 user_data2) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!sanitize_shallow (c, base))) return_trace (false);
-    const Type &obj = StructAtOffset<Type> (base, *this);
-    return_trace (likely (obj.sanitize (c, user_data1, user_data2)) || neuter (c));
+    return_trace (sanitize_shallow (c, base) &&
+		  (StructAtOffset<Type> (base, *this).sanitize (c, user_data1, user_data2) ||
+		   neuter (c)));
   }
 
   /* Set the offset to Null */
commit b482e5231cd5987082dd2c05fd649c3653f3c67a
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Sep 13 16:29:49 2018 +0200

    OffsetTo::sanitize() reshuffling

diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 5d09c520..2c71f819 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -260,27 +260,39 @@ struct OffsetTo : Offset<OffsetType>
       this->set (0);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  inline bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return_trace (false);
     unsigned int offset = *this;
     if (unlikely (!offset)) return_trace (true);
     if (unlikely (!c->check_range (base, offset))) return_trace (false);
-    const Type &obj = StructAtOffset<Type> (base, offset);
+    return_trace (true);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, base))) return_trace (false);
+    const Type &obj = StructAtOffset<Type> (base, *this);
     return_trace (likely (obj.sanitize (c)) || neuter (c));
   }
   template <typename T>
   inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this))) return_trace (false);
-    unsigned int offset = *this;
-    if (unlikely (!offset)) return_trace (true);
-    if (unlikely (!c->check_range (base, offset))) return_trace (false);
-    const Type &obj = StructAtOffset<Type> (base, offset);
+    if (unlikely (!sanitize_shallow (c, base))) return_trace (false);
+    const Type &obj = StructAtOffset<Type> (base, *this);
     return_trace (likely (obj.sanitize (c, user_data)) || neuter (c));
   }
+  template <typename T1, typename T2>
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T1 user_data1, T2 user_data2) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!sanitize_shallow (c, base))) return_trace (false);
+    const Type &obj = StructAtOffset<Type> (base, *this);
+    return_trace (likely (obj.sanitize (c, user_data1, user_data2)) || neuter (c));
+  }
 
   /* Set the offset to Null */
   inline bool neuter (hb_sanitize_context_t *c) const {
commit bd75fd45cdbd0edb24568326bb7fde59d299a82c
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Sep 11 18:12:26 2018 +0200

    [dfont] Some renaming, plus add link to reference doc

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index bbfc8f0e..26e68bb5 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -287,9 +287,11 @@ struct TTCHeader
 
 /*
  * Mac Resource Fork
+ *
+ * http://mirror.informatimago.com/next/developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html
  */
 
-struct ResourceRefItem
+struct ResourceRecord
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -298,10 +300,10 @@ struct ResourceRefItem
     return_trace (likely (c->check_struct (this)));
   }
 
-  HBINT16	id;		/* Resource ID, is really should be signed? */
+  HBUINT16	id;		/* Resource ID, is really should be signed? */
   HBINT16	nameOffset;	/* Offset from beginning of resource name list
 				 * to resource name, -1 means there is none. */
-  HBUINT8	attr;		/* Resource attributes */
+  HBUINT8	attrs;		/* Resource attributes */
   HBUINT24	dataOffset;	/* Offset from beginning of resource data to
 				 * data for this resource */
   HBUINT32	reserved;	/* Reserved for handle to resource */
@@ -309,7 +311,7 @@ struct ResourceRefItem
   DEFINE_SIZE_STATIC (12);
 };
 
-struct ResourceTypeItem
+struct ResourceTypeRecord
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -318,20 +320,20 @@ struct ResourceTypeItem
     return_trace (likely (c->check_struct (this)));
   }
 
-  inline unsigned int get_resource_count () const { return numRes + 1; }
+  inline unsigned int get_resource_count () const { return resCountM1 + 1; }
 
-  inline bool is_sfnt () const { return type == HB_TAG ('s','f','n','t'); }
+  inline bool is_sfnt () const { return tag == HB_TAG ('s','f','n','t'); }
 
-  inline const ResourceRefItem& get_ref_item (const void *base,
-					      unsigned int i) const
+  inline const ResourceRecord& get_resource_record (const void *base,
+						    unsigned int i) const
   {
     return (base+refList)[i];
   }
 
   protected:
-  Tag		type;		/* Resource type. */
-  HBUINT16	numRes;		/* Number of resources minus 1. */
-  OffsetTo<UnsizedArrayOf<ResourceRefItem> >
+  Tag		tag;		/* Resource type. */
+  HBUINT16	resCountM1;	/* Number of resources minus 1. */
+  OffsetTo<UnsizedArrayOf<ResourceRecord> >
 		refList;	/* Offset from beginning of resource type list
 				 * to reference item list for this type. */
   public:
@@ -347,51 +349,41 @@ struct ResourceMap
       return_trace (false);
     for (unsigned int i = 0; i < get_types_count (); ++i)
     {
-      const ResourceTypeItem& type = get_type (i);
+      const ResourceTypeRecord& type = get_type_record (i);
       if (unlikely (!type.sanitize (c)))
         return_trace (false);
       for (unsigned int j = 0; j < type.get_resource_count (); ++j)
-	if (unlikely (!get_ref_item (type, j).sanitize (c)))
+	if (unlikely (!get_resource_record (type, j).sanitize (c)))
 	  return_trace (false);
     }
     return_trace (true);
   }
 
-  inline const ResourceTypeItem& get_type (unsigned int i) const
+  inline const ResourceTypeRecord& get_type_record (unsigned int i) const
   {
-    // Why offset from the second byte of the object? I'm not sure
-    return ((&reserved[2])+typeList)[i];
+    // Why offset from the third byte of the object? I'm not sure
+    return (((const char *) this + 2)+typeListZ)[i];
   }
 
-  inline unsigned int get_types_count () const { return nTypes + 1; }
-
-  inline const ResourceRefItem &get_ref_item (const ResourceTypeItem &type,
-					      unsigned int i) const
-  {
-    return type.get_ref_item (&(this+typeList), i);
-  }
+  inline unsigned int get_types_count () const { return typeCountM1 + 1; }
 
-  inline const PString& get_name (const ResourceRefItem &item,
-				  unsigned int i) const
+  inline const ResourceRecord &get_resource_record (const ResourceTypeRecord &type,
+						    unsigned int i) const
   {
-    if (item.nameOffset < 0)
-      return Null (PString);
-
-    return StructAtOffset<PString> (this, nameList + item.nameOffset);
+    return type.get_resource_record (&(this+typeListZ), i);
   }
 
   protected:
-  HBUINT8	reserved[16];	/* Reserved for copy of resource header */
-  LOffsetTo<ResourceMap>
-		reserved1;	/* Reserved for handle to next resource map */
-  HBUINT16	reserved2;	/* Reserved for file reference number */
-  HBUINT16	attr;		/* Resource fork attribute */
-  OffsetTo<UnsizedArrayOf<ResourceTypeItem> >
-		typeList;	/* Offset from beginning of map to
+  HBUINT8	reserved0[16];	/* Reserved for copy of resource header */
+  HBUINT32	reserved1;	/* Reserved for handle to next resource map */
+  HBUINT16	resreved2;	/* Reserved for file reference number */
+  HBUINT16	attrs;		/* Resource fork attribute */
+  OffsetTo<UnsizedArrayOf<ResourceTypeRecord> >
+		typeListZ;	/* Offset from beginning of map to
 				 * resource type list */
   Offset16	nameList;	/* Offset from beginning of map to
 				 * resource name list */
-  HBUINT16	nTypes;		/* Number of types in the map minus 1 */
+  HBUINT16	typeCountM1;	/* Number of types in the map minus 1 */
   public:
   DEFINE_SIZE_STATIC (30);
 };
@@ -403,19 +395,18 @@ struct ResourceForkHeader
     const ResourceMap &resource_map = this+map;
     for (unsigned int i = 0; i < resource_map.get_types_count (); ++i)
     {
-      const ResourceTypeItem& type = resource_map.get_type (i);
+      const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt ())
 	return type.get_resource_count ();
     }
     return 0;
   }
 
-  inline const LArrayOf<HBUINT8>& get_data (const ResourceTypeItem& type,
+  inline const LArrayOf<HBUINT8>& get_data (const ResourceTypeRecord& type,
 					    unsigned int idx) const
   {
     const ResourceMap &resource_map = this+map;
-    unsigned int offset = dataOffset;
-    offset += resource_map.get_ref_item (type, idx).dataOffset;
+    unsigned int offset = dataOffset + resource_map.get_resource_record (type, idx).dataOffset;
     return StructAtOffset<LArrayOf<HBUINT8> > (this, offset);
   }
 
@@ -424,7 +415,7 @@ struct ResourceForkHeader
     const ResourceMap &resource_map = this+map;
     for (unsigned int i = 0; i < resource_map.get_types_count (); ++i)
     {
-      const ResourceTypeItem& type = resource_map.get_type (i);
+      const ResourceTypeRecord& type = resource_map.get_type_record (i);
       if (type.is_sfnt () && idx < type.get_resource_count ())
       {
 	const OpenTypeFontFace &face = (OpenTypeFontFace&) get_data (type, idx).arrayZ;
@@ -448,7 +439,7 @@ struct ResourceForkHeader
 
     for (unsigned int i = 0; i < resource_map.get_types_count (); ++i)
     {
-      const ResourceTypeItem& type = resource_map.get_type (i);
+      const ResourceTypeRecord& type = resource_map.get_type_record (i);
       for (unsigned int j = 0; j < type.get_resource_count (); ++j)
       {
         const LArrayOf<HBUINT8>& data = get_data (type, j);
@@ -465,7 +456,7 @@ struct ResourceForkHeader
   }
 
   protected:
-  HBUINT32	dataOffset;	/* Offset from beginning of resource fork
+  Offset32	dataOffset;	/* Offset from beginning of resource fork
 				 * to resource data */
   LOffsetTo<ResourceMap>
 		map;		/* Offset from beginning of resource fork
commit 4134ec1307bbaff24972e238bc5e4a403cd3f1c1
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Sep 11 17:56:03 2018 +0200

    [dfont] Sanitize only sfnt resources as OpenTypeFontFile

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 35a774dd..bbfc8f0e 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -300,7 +300,7 @@ struct ResourceRefItem
 
   HBINT16	id;		/* Resource ID, is really should be signed? */
   HBINT16	nameOffset;	/* Offset from beginning of resource name list
-				 * to resource name, minus means there is none. */
+				 * to resource name, -1 means there is none. */
   HBUINT8	attr;		/* Resource attributes */
   HBUINT24	dataOffset;	/* Offset from beginning of resource data to
 				 * data for this resource */
@@ -374,7 +374,7 @@ struct ResourceMap
   inline const PString& get_name (const ResourceRefItem &item,
 				  unsigned int i) const
   {
-    if (item.nameOffset == -1)
+    if (item.nameOffset < 0)
       return Null (PString);
 
     return StructAtOffset<PString> (this, nameList + item.nameOffset);
@@ -452,8 +452,11 @@ struct ResourceForkHeader
       for (unsigned int j = 0; j < type.get_resource_count (); ++j)
       {
         const LArrayOf<HBUINT8>& data = get_data (type, j);
-	if (unlikely (!(data.sanitize (c) &&
-			((OpenTypeFontFace&) data.arrayZ).sanitize (c))))
+	if (unlikely (!data.sanitize (c)))
+	  return_trace (false);
+
+	if (unlikely (type.is_sfnt () &&
+		      !((OpenTypeFontFace&) data.arrayZ).sanitize (c)))
 	  return_trace (false);
       }
     }
commit 6b5e4d07adb6b739dc294da513c4a7acd03977f7
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Sep 11 17:26:24 2018 +0200

    [dfont] Minor

diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 39c6aeb8..35a774dd 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -363,10 +363,7 @@ struct ResourceMap
     return ((&reserved[2])+typeList)[i];
   }
 
-  inline unsigned int get_types_count () const
-  {
-    return nTypes + 1;
-  }
+  inline unsigned int get_types_count () const { return nTypes + 1; }
 
   inline const ResourceRefItem &get_ref_item (const ResourceTypeItem &type,
 					      unsigned int i) const
@@ -392,7 +389,7 @@ struct ResourceMap
   OffsetTo<UnsizedArrayOf<ResourceTypeItem> >
 		typeList;	/* Offset from beginning of map to
 				 * resource type list */
-  HBUINT16	nameList;	/* Offset from beginning of map to
+  Offset16	nameList;	/* Offset from beginning of map to
 				 * resource name list */
   HBUINT16	nTypes;		/* Number of types in the map minus 1 */
   public:


More information about the HarfBuzz mailing list