Add CrapPool

Common Regoin for Access Protection.  Like the NullPool, but writable.
This commit is contained in:
Behdad Esfahbod 2018-05-24 11:33:15 -07:00
parent 673b764de0
commit 5d80129891
7 changed files with 51 additions and 4 deletions

View File

@ -48,6 +48,7 @@
#ifndef HB_NO_VISIBILITY #ifndef HB_NO_VISIBILITY
const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
#endif #endif
void cbdt_callback (const uint8_t* data, unsigned int length, void cbdt_callback (const uint8_t* data, unsigned int length,

View File

@ -28,6 +28,7 @@
#ifndef HB_NO_VISIBILITY #ifndef HB_NO_VISIBILITY
const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
#endif #endif
template <typename Type, int Bytes> struct LEInt; template <typename Type, int Bytes> struct LEInt;

View File

@ -932,6 +932,7 @@ struct ArrayOf
} }
inline Type& operator [] (unsigned int i) inline Type& operator [] (unsigned int i)
{ {
if (unlikely (i >= len)) return Crap(Type);
return arrayZ[i]; return arrayZ[i];
} }
inline unsigned int get_size (void) const inline unsigned int get_size (void) const
@ -1040,6 +1041,11 @@ struct OffsetListOf : OffsetArrayOf<Type>
if (unlikely (i >= this->len)) return Null(Type); if (unlikely (i >= this->len)) return Null(Type);
return this+this->arrayZ[i]; 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 inline bool sanitize (hb_sanitize_context_t *c) const
{ {
@ -1064,6 +1070,11 @@ struct HeadlessArrayOf
if (unlikely (i >= len || !i)) return Null(Type); if (unlikely (i >= len || !i)) return Null(Type);
return arrayZ[i-1]; 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 inline unsigned int get_size (void) const
{ return len.static_size + (len ? len - 1 : 0) * Type::static_size; } { return len.static_size + (len ? len - 1 : 0) * Type::static_size; }

View File

@ -48,6 +48,7 @@
#ifndef HB_NO_VISIBILITY #ifndef HB_NO_VISIBILITY
const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
#endif #endif

View File

@ -529,7 +529,7 @@ _hb_ceil_to_4 (unsigned int v)
*/ */
/* /*
* Null objects * Static pools
*/ */
/* Global nul-content Null pool. Enlarge as necessary. */ /* Global nul-content Null pool. Enlarge as necessary. */
@ -547,7 +547,6 @@ const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
= {} = {}
#endif #endif
; ;
/* Generic nul-content Null objects. */ /* Generic nul-content Null objects. */
template <typename Type> template <typename Type>
static inline const Type& Null (void) { 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.") 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 */ /* arrays and maps */
@ -589,8 +610,18 @@ struct hb_vector_t
arrayZ = static_array; arrayZ = static_array;
} }
inline Type& operator [] (unsigned int i) { return arrayZ[i]; } inline Type& operator [] (unsigned int i)
inline const Type& operator [] (unsigned int i) const { return arrayZ[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) inline Type *push (void)
{ {

View File

@ -46,6 +46,7 @@
#if !defined(HB_NO_VISIBILITY) && !defined(HB_SUBSET_BUILTIN) #if !defined(HB_NO_VISIBILITY) && !defined(HB_SUBSET_BUILTIN)
const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
#endif #endif

View File

@ -39,6 +39,7 @@ using namespace OT;
#ifndef HB_NO_VISIBILITY #ifndef HB_NO_VISIBILITY
const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
#endif #endif
int int