[HarfBuzz] harfbuzz: Branch 'master' - 2 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Thu Nov 22 06:19:43 UTC 2018
src/hb-aat-layout-common.hh | 2 +-
src/hb-machinery.hh | 4 ++++
src/hb-null.hh | 17 +++++++++++++++--
src/hb-ot-kern-table.hh | 2 +-
src/hb-ot-var-fvar-table.hh | 31 ++++++++++++++++---------------
5 files changed, 37 insertions(+), 19 deletions(-)
New commits:
commit 3b9fd176e83bbebc4d0b5fc967c15b08fdef7015
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Nov 22 01:18:55 2018 -0500
Disallow taking Null() of unbounded structs
Not sure I've marked all such structs. To be done as we discover.
Fixes https://github.com/harfbuzz/harfbuzz/issues/1300
diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh
index 6572b26d..7340996e 100644
--- a/src/hb-aat-layout-common.hh
+++ b/src/hb-aat-layout-common.hh
@@ -69,7 +69,7 @@ struct LookupFormat0
UnsizedArrayOf<T>
arrayZ; /* Array of lookup values, indexed by glyph index. */
public:
- DEFINE_SIZE_ARRAY (2, arrayZ);
+ DEFINE_SIZE_UNBOUNDED (2);
};
diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh
index a8d1ad53..cb30e990 100644
--- a/src/hb-machinery.hh
+++ b/src/hb-machinery.hh
@@ -112,6 +112,10 @@ static inline Type& StructAfter(TObject &X)
enum { null_size = (size) }; \
enum { min_size = (size) }
+#define DEFINE_SIZE_UNBOUNDED(size) \
+ DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+ enum { min_size = (size) }
+
#define DEFINE_SIZE_ARRAY(size, array) \
DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])) \
diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh
index 14e06568..ebb231a1 100644
--- a/src/hb-ot-kern-table.hh
+++ b/src/hb-ot-kern-table.hh
@@ -154,7 +154,7 @@ struct KernSubTable
KernSubTableFormat3<KernSubTableHeader> format3;
} u;
public:
- DEFINE_SIZE_MIN (0);
+ DEFINE_SIZE_UNBOUNDED (KernSubTableHeader::static_size);
};
diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh
index 5c8832e1..fed334e8 100644
--- a/src/hb-ot-var-fvar-table.hh
+++ b/src/hb-ot-var-fvar-table.hh
@@ -65,7 +65,7 @@ struct InstanceRecord
// * instance. */
public:
- DEFINE_SIZE_ARRAY (4, coordinatesZ);
+ DEFINE_SIZE_UNBOUNDED (4);
};
struct AxisRecord
@@ -109,7 +109,7 @@ struct fvar
axisSize == 20 && /* Assumed in our code. */
instanceSize >= axisCount * 4 + 4 &&
get_axes ().sanitize (c) &&
- c->check_range (&get_instance (0), instanceCount, instanceSize));
+ c->check_range (get_instance (0), instanceCount, instanceSize));
}
inline unsigned int get_axis_count (void) const
@@ -240,15 +240,17 @@ struct fvar
inline hb_ot_name_id_t get_instance_subfamily_name_id (unsigned int instance_index) const
{
- const InstanceRecord &instance = get_instance (instance_index);
- return instance.subfamilyNameID;
+ const InstanceRecord *instance = get_instance (instance_index);
+ if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+ return instance->subfamilyNameID;
}
inline hb_ot_name_id_t get_instance_postscript_name_id (unsigned int instance_index) const
{
- const InstanceRecord &instance = get_instance (instance_index);
+ const InstanceRecord *instance = get_instance (instance_index);
+ if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
if (instanceSize >= axisCount * 4 + 6)
- return StructAfter<NameID> (instance.get_coordinates (axisCount));
+ return StructAfter<NameID> (instance->get_coordinates (axisCount));
return HB_OT_NAME_ID_INVALID;
}
@@ -256,7 +258,8 @@ struct fvar
unsigned int *coords_length, /* IN/OUT */
float *coords /* OUT */) const
{
- if (unlikely (instance_index >= instanceCount))
+ const InstanceRecord *instance = get_instance (instance_index);
+ if (unlikely (!instance))
{
if (coords_length)
*coords_length = 0;
@@ -265,9 +268,8 @@ struct fvar
if (coords_length && *coords_length)
{
- const InstanceRecord &instance = get_instance (instance_index);
- hb_array_t<const Fixed> instanceCoords = instance.get_coordinates (axisCount)
- .sub_array (0, *coords_length);
+ hb_array_t<const Fixed> instanceCoords = instance->get_coordinates (axisCount)
+ .sub_array (0, *coords_length);
for (unsigned int i = 0; i < instanceCoords.len; i++)
coords[i] = instanceCoords.arrayZ[i].to_float ();
}
@@ -278,12 +280,11 @@ struct fvar
inline hb_array_t<const AxisRecord> get_axes (void) const
{ return hb_array (&(this+firstAxis), axisCount); }
- inline const InstanceRecord &get_instance (unsigned int i) const
+ inline const InstanceRecord *get_instance (unsigned int i) const
{
- if (unlikely (i >= instanceCount)) return Null (InstanceRecord);
-
- return StructAtOffset<InstanceRecord> (&StructAfter<InstanceRecord> (get_axes ()),
- i * instanceSize);
+ if (unlikely (i >= instanceCount)) return nullptr;
+ return &StructAtOffset<InstanceRecord> (&StructAfter<InstanceRecord> (get_axes ()),
+ i * instanceSize);
}
protected:
commit f2b91d6510face95008151bb0d25837723536f9f
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Nov 22 01:10:22 2018 -0500
Use Type::null_size for our structs in Null(), sizeof() for other types
diff --git a/src/hb-null.hh b/src/hb-null.hh
index 51f653d2..92c7a351 100644
--- a/src/hb-null.hh
+++ b/src/hb-null.hh
@@ -38,13 +38,26 @@
#define HB_NULL_POOL_SIZE 1024
+/* Use SFINAE to sniff whether T has min_size; in which case return T::null_size,
+ * otherwise return sizeof(T). */
+template <typename T, bool b>
+struct _hb_null_size
+{ enum { value = sizeof (T) }; };
+template <typename T>
+struct _hb_null_size<T, T::min_size ? false : false>
+{ enum { value = T::null_size }; };
+
+template <typename T>
+struct hb_null_size
+{ enum { value = _hb_null_size<T, false>::value }; };
+
extern HB_INTERNAL
hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)];
/* Generic nul-content Null objects. */
template <typename Type>
static inline Type const & Null (void) {
- static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+ static_assert (hb_null_size<Type>::value <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
return *reinterpret_cast<Type const *> (_hb_NullPool);
}
#define Null(Type) Null<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>()
@@ -85,7 +98,7 @@ extern HB_INTERNAL
/* 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.");
+ static_assert (hb_null_size<Type>::value <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
memcpy (obj, &Null(Type), sizeof (*obj));
return *obj;
More information about the HarfBuzz
mailing list