[HB] Add check to avoid infinite recursion

This commit is contained in:
Behdad Esfahbod 2009-05-17 21:11:49 -04:00
parent 887c4b4416
commit 6cf2a52593
1 changed files with 8 additions and 4 deletions

View File

@ -646,7 +646,7 @@ struct SubstLookup : Lookup {
if (HB_UNLIKELY (type == GSUB_Extension)) { if (HB_UNLIKELY (type == GSUB_Extension)) {
/* Return lookup type of first extension subtable. /* Return lookup type of first extension subtable.
* The spec says all of them should have the same type. * The spec says all of them should have the same type.
* XXX check for that somehow */ * XXX check for that in sanitize() */
type = get_subtable(0).u.extension->get_type (); type = get_subtable(0).u.extension->get_type ();
} }
@ -763,10 +763,14 @@ ASSERT_SIZE (GSUB, 10);
/* Out-of-class implementation for methods recursing */ /* Out-of-class implementation for methods recursing */
inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF) const { inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF) const {
/* XXX either check in sanitize or here that the lookuptype is not 7 again, unsigned int lookup_type = get_type ();
* or we can loop indefinitely. */
/* TODO: belongs to sanitize() */
if (HB_UNLIKELY (lookup_type == GSUB_ReverseChainSingle))
return false;
return (*(SubstLookupSubTable *)(((char *) this) + get_offset ())).substitute (LOOKUP_ARGS, return (*(SubstLookupSubTable *)(((char *) this) + get_offset ())).substitute (LOOKUP_ARGS,
get_type ()); lookup_type);
} }
static inline bool substitute_lookup (LOOKUP_ARGS_DEF, unsigned int lookup_index) { static inline bool substitute_lookup (LOOKUP_ARGS_DEF, unsigned int lookup_index) {