diff options
Diffstat (limited to 'pango/opentype/hb-ot-layout-gsubgpos-private.hh')
-rw-r--r-- | pango/opentype/hb-ot-layout-gsubgpos-private.hh | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/pango/opentype/hb-ot-layout-gsubgpos-private.hh b/pango/opentype/hb-ot-layout-gsubgpos-private.hh index 13f9dbad..a14166c7 100644 --- a/pango/opentype/hb-ot-layout-gsubgpos-private.hh +++ b/pango/opentype/hb-ot-layout-gsubgpos-private.hh @@ -260,6 +260,14 @@ struct Rule lookup_context); } + public: + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE_SELF ()) return false; + return SANITIZE_MEM (input, + sizeof (input[0]) * inputCount + + sizeof (lookupRecordX[0]) * lookupCount); + } + private: USHORT inputCount; /* Total number of glyphs in input * glyph sequence--includes the first @@ -286,6 +294,10 @@ struct RuleSet return false; } + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_THIS (rule); + } + private: OffsetArrayOf<Rule> rule; /* Array of Rule tables @@ -312,6 +324,10 @@ struct ContextFormat1 return rule_set.apply (APPLY_ARG, lookup_context); } + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_THIS2 (coverage, ruleSet); + } + private: USHORT format; /* Format identifier--format = 1 */ OffsetTo<Coverage> @@ -348,6 +364,10 @@ struct ContextFormat2 return rule_set.apply (APPLY_ARG, lookup_context); } + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_THIS2 (coverage, classDef) && SANITIZE_THIS (ruleSet); + } + private: USHORT format; /* Format identifier--format = 2 */ OffsetTo<Coverage> @@ -387,6 +407,17 @@ struct ContextFormat3 lookup_context); } + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE_SELF ()) return false; + unsigned int count = glyphCount; + for (unsigned int i = 0; i < count; i++) + if (!SANITIZE_THIS (coverage[i])) return false; + LookupRecord *lookupRecord = (LookupRecord *) + ((char *) coverage + + sizeof (coverage[0]) * glyphCount); + return SANITIZE_MEM (lookupRecord, sizeof (lookupRecord[0]) * lookupCount); + } + private: USHORT format; /* Format identifier--format = 3 */ USHORT glyphCount; /* Number of glyphs in the input glyph @@ -413,6 +444,16 @@ struct Context } } + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE (u.format)) return false; + switch (u.format) { + case 1: return u.format1->sanitize (SANITIZE_ARG); + case 2: return u.format2->sanitize (SANITIZE_ARG); + case 3: return u.format3->sanitize (SANITIZE_ARG); + default:return true; + } + } + private: union { USHORT format; /* Format identifier */ @@ -490,6 +531,19 @@ struct ChainRule return false; } + public: + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE (backtrack)) return false; + HeadlessArrayOf<USHORT> &input = *(HeadlessArrayOf<USHORT>*) + ((char *) &backtrack + backtrack.get_size ()); + if (!SANITIZE (input)) return false; + ArrayOf<USHORT> &lookahead = *(ArrayOf<USHORT>*) + ((char *) &input + input.get_size ()); + if (!SANITIZE (lookahead)) return false; + ArrayOf<LookupRecord> &lookup = *(ArrayOf<LookupRecord>*) + ((char *) &lookahead + lookahead.get_size ()); + return SANITIZE (lookup); + } private: ArrayOf<USHORT> @@ -522,6 +576,10 @@ struct ChainRuleSet return false; } + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_THIS (rule); + } + private: OffsetArrayOf<ChainRule> rule; /* Array of ChainRule tables @@ -547,6 +605,11 @@ struct ChainContextFormat1 }; return rule_set.apply (APPLY_ARG, lookup_context); } + + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_THIS2 (coverage, ruleSet); + } + private: USHORT format; /* Format identifier--format = 1 */ OffsetTo<Coverage> @@ -587,6 +650,12 @@ struct ChainContextFormat2 return rule_set.apply (APPLY_ARG, lookup_context); } + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_THIS2 (coverage, backtrackClassDef) && + SANITIZE_THIS2 (inputClassDef, lookaheadClassDef) && + SANITIZE_THIS (ruleSet); + } + private: USHORT format; /* Format identifier--format = 2 */ OffsetTo<Coverage> @@ -642,6 +711,19 @@ struct ChainContextFormat3 return false; } + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE_THIS (backtrack)) return false; + OffsetArrayOf<Coverage> &input = *(OffsetArrayOf<Coverage>*) + ((char *) &backtrack + backtrack.get_size ()); + if (!SANITIZE_THIS (input)) return false; + OffsetArrayOf<Coverage> &lookahead = *(OffsetArrayOf<Coverage>*) + ((char *) &input + input.get_size ()); + if (!SANITIZE_THIS (lookahead)) return false; + ArrayOf<LookupRecord> &lookup = *(ArrayOf<LookupRecord>*) + ((char *) &lookahead + lookahead.get_size ()); + return SANITIZE (lookup); + } + private: USHORT format; /* Format identifier--format = 3 */ OffsetArrayOf<Coverage> @@ -675,6 +757,16 @@ struct ChainContext } } + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE (u.format)) return false; + switch (u.format) { + case 1: return u.format1->sanitize (SANITIZE_ARG); + case 2: return u.format2->sanitize (SANITIZE_ARG); + case 3: return u.format3->sanitize (SANITIZE_ARG); + default:return true; + } + } + private: union { USHORT format; /* Format identifier */ @@ -700,6 +792,10 @@ struct ExtensionFormat1 return *(LookupSubTable*)(((char *) this) + offset); } + inline bool sanitize (SANITIZE_ARG_DEF) { + return SANITIZE_SELF (); + } + private: USHORT format; /* Format identifier. Set to 1. */ USHORT extensionLookupType; /* Lookup type of subtable referenced @@ -729,6 +825,14 @@ struct Extension } } + inline bool sanitize (SANITIZE_ARG_DEF) { + if (!SANITIZE (u.format)) return false; + switch (u.format) { + case 1: return u.format1->sanitize (SANITIZE_ARG); + default:return true; + } + } + private: union { USHORT format; /* Format identifier */ |