summaryrefslogtreecommitdiff
path: root/pango/opentype/hb-ot-layout-gsubgpos-private.hh
diff options
context:
space:
mode:
Diffstat (limited to 'pango/opentype/hb-ot-layout-gsubgpos-private.hh')
-rw-r--r--pango/opentype/hb-ot-layout-gsubgpos-private.hh104
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 */