src/hb-common.cc | 4 ++- src/hb-open-type-private.hh | 26 ++++++++++++------------ src/hb-ot-cmap-table.hh | 40 ++++++++++++++++++++++++++----------- src/hb-ot-layout-common-private.hh | 4 +-- src/hb-private.hh | 2 - src/hb-shape-plan.cc | 4 +-- 6 files changed, 51 insertions(+), 29 deletions(-)
New commits: commit f1a72fe7bf863535ec09b559cc0bd878fd0799f2 Author: Behdad Esfahbod <[email protected]> Date: Wed Jun 4 19:00:29 2014 -0400 [ot-font] Fix cmap EncodingRecord cmp order diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index b7c89ce..e21baed 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -332,12 +332,12 @@ struct CmapSubtable struct EncodingRecord { - int cmp (const EncodingRecord &other) const + inline int cmp (const EncodingRecord &other) const { int ret; - ret = other.platformID.cmp (platformID); + ret = platformID.cmp (other.platformID); if (ret) return ret; - ret = other.encodingID.cmp (encodingID); + ret = encodingID.cmp (other.encodingID); if (ret) return ret; return 0; } @@ -381,8 +381,12 @@ struct cmap encodingRecord.sanitize (c, this)); } - USHORT version; /* Table version number (0). */ - ArrayOf<EncodingRecord> encodingRecord; /* Encoding tables. */ + USHORT version; /* Table version number (0). */ + /* Note: We can use the Sorted array variant, but since it + * has no performance implications, we use non-sorted array and + * as such accept fonts with unsorted subtable list. */ + /*Sorted*/ArrayOf<EncodingRecord> + encodingRecord; /* Encoding tables. */ public: DEFINE_SIZE_ARRAY (4, encodingRecord); }; commit ce34f0b07e5324ed52e6e2c43000c2b09ee010d4 Author: Behdad Esfahbod <[email protected]> Date: Wed Jun 4 18:57:46 2014 -0400 [ot-font] Use binary search for format12 cmap subtable diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index fcdee02..c4446ce 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -985,6 +985,10 @@ struct GenericSortedArrayOf : GenericArrayOf<LenType, Type> template <typename Type> struct SortedArrayOf : GenericSortedArrayOf<USHORT, Type> {}; +/* A sorted array with a ULONG number of elements. */ +template <typename Type> +struct LongSortedArrayOf : GenericSortedArrayOf<ULONG, Type> {}; + } /* namespace OT */ diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 65434c4..b7c89ce 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -264,7 +264,7 @@ struct CmapSubtableLongSegmented USHORT reserved; /* Reserved; set to 0. */ ULONG length; /* Byte length of this subtable. */ ULONG language; /* Ignore. */ - LongArrayOf<CmapSubtableLongGroup> + LongSortedArrayOf<CmapSubtableLongGroup> groups; /* Groupings. */ public: DEFINE_SIZE_ARRAY (16, groups); commit 257d1adfa1b3422c511c55e641840a6e31ec6008 Author: Behdad Esfahbod <[email protected]> Date: Wed Jun 4 18:47:55 2014 -0400 [ot-font] Work around broken cmap subtable format 4 length Roboto was hitting this. FreeType also has pretty much the same code for this, in ttcmap.c:tt_cmap4_validate(): /* in certain fonts, the `length' field is invalid and goes */ /* out of bound. We try to correct this here... */ if ( table + length > valid->limit ) { if ( valid->level >= FT_VALIDATE_TIGHT ) FT_INVALID_TOO_SHORT; length = (FT_UInt)( valid->limit - table ); } diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index abaceaa..65434c4 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -131,11 +131,25 @@ struct CmapSubtableFormat4 return true; } - inline bool sanitize (hb_sanitize_context_t *c) { + inline bool sanitize (hb_sanitize_context_t *c) + { TRACE_SANITIZE (this); - return TRACE_RETURN (c->check_struct (this) && - c->check_range (this, length) && - 16 + 4 * (unsigned int) segCountX2 < length); + if (unlikely (!c->check_struct (this))) + return TRACE_RETURN (false); + + if (unlikely (!c->check_range (this, length))) + { + /* Some broken fonts have too long of a "length" value. + * If that is the case, just change the value to truncate + * the subtable at the end of the blob. */ + uint16_t new_length = (uint16_t) MIN ((uintptr_t) 65535, + (uintptr_t) (c->end - + (char *) this)); + if (!c->try_set (&length, new_length)) + return TRACE_RETURN (false); + } + + return TRACE_RETURN (16 + 4 * (unsigned int) segCountX2 <= length); } protected: commit 51f563579b94e1ee23ced9bbcc7dd3341535ce72 Author: Behdad Esfahbod <[email protected]> Date: Wed Jun 4 18:42:32 2014 -0400 Move try_set to sanitize context diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 965d4d7..fcdee02 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -266,6 +266,15 @@ struct hb_sanitize_context_t return TRACE_RETURN (this->writable); } + template <typename Type, typename ValueType> + inline bool try_set (Type *obj, const ValueType &v) { + if (this->may_edit (obj, obj->static_size)) { + obj->set (v); + return true; + } + return false; + } + mutable unsigned int debug_depth; const char *start, *end; bool writable; @@ -722,20 +731,9 @@ struct GenericOffsetTo : OffsetType return TRACE_RETURN (likely (obj.sanitize (c, user_data)) || neuter (c)); } - inline bool try_set (hb_sanitize_context_t *c, const OffsetType &v) { - if (c->may_edit (this, this->static_size)) { - this->set (v); - return true; - } - return false; - } /* Set the offset to Null */ inline bool neuter (hb_sanitize_context_t *c) { - if (c->may_edit (this, this->static_size)) { - this->set (0); /* 0 is Null offset */ - return true; - } - return false; + return c->try_set (this, 0); } }; template <typename Base, typename OffsetType, typename Type> diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh index 4c6792f..688bf65 100644 --- a/src/hb-ot-layout-common-private.hh +++ b/src/hb-ot-layout-common-private.hh @@ -519,7 +519,7 @@ struct Feature /* Check that it did not overflow. */ new_offset.set (new_offset_int); if (new_offset == new_offset_int && - featureParams.try_set (c, new_offset) && + c->try_set (&featureParams, new_offset) && !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)) return TRACE_RETURN (false); } commit 500737e8e16dce5248aff394899bb3761a9c3bbf Author: Behdad Esfahbod <[email protected]> Date: Wed Jun 4 18:17:29 2014 -0400 [ot-font] Don't select a Null cmap subtable Can happen either in broken fonts, or as a result of sanitize(). diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index b0f01e1..abaceaa 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -354,7 +354,7 @@ struct cmap key.encodingID.set (encoding_id); int result = encodingRecord.search (key); - if (result == -1) + if (result == -1 || !encodingRecord[result].subtable) return NULL; return &(this+encodingRecord[result].subtable); commit dac86026a6bae5a8a03cfe885bf93f32e5f48614 Author: Behdad Esfahbod <[email protected]> Date: Tue Jun 3 17:57:00 2014 -0400 Fix some cppcheck warnings Bug 77800 - cppcheck reports diff --git a/src/hb-common.cc b/src/hb-common.cc index 96725c4..afaecce 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -299,9 +299,11 @@ hb_language_from_string (const char *str, int len) if (len >= 0) { + /* NUL-terminate it. */ len = MIN (len, (int) sizeof (strbuf) - 1); - str = (char *) memcpy (strbuf, str, len); + memcpy (strbuf, str, len); strbuf[len] = '\0'; + str = strbuf; } hb_language_item_t *item = lang_find_or_insert (str); diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh index 02d0d0f..4c6792f 100644 --- a/src/hb-ot-layout-common-private.hh +++ b/src/hb-ot-layout-common-private.hh @@ -513,7 +513,7 @@ struct Feature closure->list_base && closure->list_base < this) { unsigned int new_offset_int = (unsigned int) orig_offset - - ((char *) this - (char *) closure->list_base); + (((char *) this) - ((char *) closure->list_base)); Offset new_offset; /* Check that it did not overflow. */ diff --git a/src/hb-private.hh b/src/hb-private.hh index 1a1926d..f361875 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -193,7 +193,7 @@ ASSERT_STATIC (sizeof (hb_var_int_t) == 4); /* Check _assertion in a method environment */ #define _ASSERT_POD1(_line) \ - inline void _static_assertion_on_line_##_line (void) const \ + HB_UNUSED inline void _static_assertion_on_line_##_line (void) const \ { _ASSERT_INSTANCE_POD1 (_line, *this); /* Make sure it's POD. */ } # define _ASSERT_POD0(_line) _ASSERT_POD1 (_line) # define ASSERT_POD() _ASSERT_POD0 (__LINE__) diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc index e354f29..5ffc6b1 100644 --- a/src/hb-shape-plan.cc +++ b/src/hb-shape-plan.cc @@ -104,8 +104,6 @@ hb_shape_plan_create (hb_face_t *face, unsigned int num_user_features, const char * const *shaper_list) { - assert (props->direction != HB_DIRECTION_INVALID); - hb_shape_plan_t *shape_plan; hb_feature_t *features = NULL; @@ -120,6 +118,8 @@ hb_shape_plan_create (hb_face_t *face, return hb_shape_plan_get_empty (); } + assert (props->direction != HB_DIRECTION_INVALID); + hb_face_make_immutable (face); shape_plan->default_shaper_list = shaper_list == NULL; shape_plan->face_unsafe = face; _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
