Fix sanitize fail of extension sublookups
Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=960331
This commit is contained in:
parent
9c0c3589f3
commit
25a5b287f2
|
@ -751,12 +751,18 @@ struct Lookup
|
||||||
if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
|
if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
|
|
||||||
if (unlikely (get_type () == TSubTable::Extension))
|
if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
|
||||||
{
|
{
|
||||||
/* The spec says all subtables of an Extension lookup should
|
/* The spec says all subtables of an Extension lookup should
|
||||||
* have the same type, which shall not be the Extension type
|
* have the same type, which shall not be the Extension type
|
||||||
* itself (but we already checked for that).
|
* itself (but we already checked for that).
|
||||||
* This is specially important if one has a reverse type! */
|
* This is specially important if one has a reverse type!
|
||||||
|
*
|
||||||
|
* We only do this if sanitizer edit_count is zero. Otherwise,
|
||||||
|
* some of the subtables might have become insane after they
|
||||||
|
* were sanity-checked by the edits of subsequent subtables.
|
||||||
|
* https://bugs.chromium.org/p/chromium/issues/detail?id=960331
|
||||||
|
*/
|
||||||
unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
|
unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
|
||||||
unsigned int count = get_subtable_count ();
|
unsigned int count = get_subtable_count ();
|
||||||
for (unsigned int i = 1; i < count; i++)
|
for (unsigned int i = 1; i < count; i++)
|
||||||
|
|
|
@ -211,6 +211,8 @@ struct hb_sanitize_context_t :
|
||||||
this->start = this->end = nullptr;
|
this->start = this->end = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned get_edit_count () { return edit_count; }
|
||||||
|
|
||||||
bool check_range (const void *base,
|
bool check_range (const void *base,
|
||||||
unsigned int len) const
|
unsigned int len) const
|
||||||
{
|
{
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue