Add CrapPool
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 24 May 2018 18:33:15 +0000 (11:33 -0700)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 24 May 2018 20:53:02 +0000 (13:53 -0700)
Common Regoin for Access Protection.  Like the NullPool, but writable.

src/dump-emoji.cc
src/dump-fon.cc
src/hb-open-type-private.hh
src/hb-ot-layout.cc
src/hb-private.hh
src/hb-subset.cc
src/main.cc

index 63af4a6..50a929b 100644 (file)
@@ -48,6 +48,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 void cbdt_callback (const uint8_t* data, unsigned int length,
index 81525f4..827de4a 100644 (file)
@@ -28,6 +28,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 template <typename Type, int Bytes> struct LEInt;
index 1c771b0..6f639dc 100644 (file)
@@ -932,6 +932,7 @@ struct ArrayOf
   }
   inline Type& operator [] (unsigned int i)
   {
+    if (unlikely (i >= len)) return Crap(Type);
     return arrayZ[i];
   }
   inline unsigned int get_size (void) const
@@ -1040,6 +1041,11 @@ struct OffsetListOf : OffsetArrayOf<Type>
     if (unlikely (i >= this->len)) return Null(Type);
     return this+this->arrayZ[i];
   }
+  inline const Type& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= this->len)) return Crap(Type);
+    return this+this->arrayZ[i];
+  }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -1064,6 +1070,11 @@ struct HeadlessArrayOf
     if (unlikely (i >= len || !i)) return Null(Type);
     return arrayZ[i-1];
   }
+  inline Type& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= len || !i)) return Crap(Type);
+    return arrayZ[i-1];
+  }
   inline unsigned int get_size (void) const
   { return len.static_size + (len ? len - 1 : 0) * Type::static_size; }
 
index 368a846..6704954 100644 (file)
@@ -48,6 +48,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 
index 4b9668e..4318eb9 100644 (file)
@@ -529,7 +529,7 @@ _hb_ceil_to_4 (unsigned int v)
  */
 
 /*
- * Null objects
+ * Static pools
  */
 
 /* Global nul-content Null pool.  Enlarge as necessary. */
@@ -547,7 +547,6 @@ const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
 = {}
 #endif
 ;
-
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline const Type& Null (void) {
@@ -569,6 +568,28 @@ namespace Namespace { \
 static_assert (Namespace::Type::min_size + 1 <= sizeof (_Null##Type), "Null pool too small.  Enlarge.")
 
 
+/* Global writable pool.  Enlarge as necessary. */
+
+#ifdef HB_NO_VISIBILITY
+static
+#else
+extern HB_INTERNAL
+#endif
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)]
+#ifdef HB_NO_VISIBILITY
+= {}
+#endif
+;
+/* CRAP pool: Common Region for Access Protection. */
+template <typename Type>
+static inline Type& Crap (void) {
+  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
+  *obj = Null(Type);
+  return *obj;
+}
+#define Crap(Type) Crap<Type>()
+
 
 /* arrays and maps */
 
@@ -589,8 +610,18 @@ struct hb_vector_t
     arrayZ = static_array;
   }
 
-  inline Type& operator [] (unsigned int i) { return arrayZ[i]; }
-  inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; }
+  inline Type& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= len))
+      return Crap (Type);
+    return arrayZ[i];
+  }
+  inline const Type& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= len))
+      return Null (Type);
+    return arrayZ[i];
+  }
 
   inline Type *push (void)
   {
index 98f95e0..ad273d0 100644 (file)
@@ -46,6 +46,7 @@
 
 #if !defined(HB_NO_VISIBILITY) && !defined(HB_SUBSET_BUILTIN)
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 
index 9a18736..f32490e 100644 (file)
@@ -39,6 +39,7 @@ using namespace OT;
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 int