[repacker] Check for nullptr's before sanitizing.

This commit is contained in:
Garret Rieger 2022-08-05 23:37:11 +00:00
parent 13253233f7
commit 163fbf0be1
3 changed files with 15 additions and 12 deletions

View File

@ -66,7 +66,7 @@ struct Coverage : public OT::Layout::Common::Coverage
unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); unsigned coverage_size = c.graph.vertices_[coverage_id].table_size ();
auto& coverage_v = c.graph.vertices_[coverage_id]; auto& coverage_v = c.graph.vertices_[coverage_id];
Coverage* coverage_table = (Coverage*) coverage_v.obj.head; Coverage* coverage_table = (Coverage*) coverage_v.obj.head;
if (!coverage_table->sanitize (coverage_v)) if (!coverage_table || !coverage_table->sanitize (coverage_v))
return nullptr; return nullptr;
auto new_coverage = auto new_coverage =

View File

@ -133,7 +133,7 @@ struct Lookup : public OT::Lookup
ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>* extension = ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>* extension =
(ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>*) (ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>*)
c.graph.object (ext_subtable_index).head; c.graph.object (ext_subtable_index).head;
if (!extension->sanitize (c.graph.vertices_[ext_subtable_index])) if (!extension || !extension->sanitize (c.graph.vertices_[ext_subtable_index]))
continue; continue;
subtable_index = extension->get_subtable_index (c.graph, ext_subtable_index); subtable_index = extension->get_subtable_index (c.graph, ext_subtable_index);
@ -143,7 +143,7 @@ struct Lookup : public OT::Lookup
} }
PairPos* pairPos = (PairPos*) c.graph.object (subtable_index).head; PairPos* pairPos = (PairPos*) c.graph.object (subtable_index).head;
if (!pairPos->sanitize (c.graph.vertices_[subtable_index])) continue; if (!pairPos || !pairPos->sanitize (c.graph.vertices_[subtable_index])) continue;
hb_vector_t<unsigned> new_sub_tables = pairPos->split_subtables (c, subtable_index); hb_vector_t<unsigned> new_sub_tables = pairPos->split_subtables (c, subtable_index);
if (new_sub_tables.in_error ()) return false; if (new_sub_tables.in_error ()) return false;
@ -320,7 +320,7 @@ struct GSTAR : public OT::GSUBGPOS
const auto& r = graph.root (); const auto& r = graph.root ();
GSTAR* gstar = (GSTAR*) r.obj.head; GSTAR* gstar = (GSTAR*) r.obj.head;
if (!gstar->sanitize (r)) if (!gstar || !gstar->sanitize (r))
return nullptr; return nullptr;
return gstar; return gstar;
@ -366,17 +366,16 @@ struct GSTAR : public OT::GSUBGPOS
hb_hashmap_t<unsigned, Lookup*>& lookups /* OUT */) hb_hashmap_t<unsigned, Lookup*>& lookups /* OUT */)
{ {
unsigned lookup_list_idx = get_lookup_list_index (graph); unsigned lookup_list_idx = get_lookup_list_index (graph);
const LookupList<Types>* lookupList = const LookupList<Types>* lookupList =
(const LookupList<Types>*) graph.object (lookup_list_idx).head; (const LookupList<Types>*) graph.object (lookup_list_idx).head;
if (!lookupList->sanitize (graph.vertices_[lookup_list_idx])) if (!lookupList || !lookupList->sanitize (graph.vertices_[lookup_list_idx]))
return; return;
for (unsigned i = 0; i < lookupList->len; i++) for (unsigned i = 0; i < lookupList->len; i++)
{ {
unsigned lookup_idx = graph.index_for_offset (lookup_list_idx, &(lookupList->arrayZ[i])); unsigned lookup_idx = graph.index_for_offset (lookup_list_idx, &(lookupList->arrayZ[i]));
Lookup* lookup = (Lookup*) graph.object (lookup_idx).head; Lookup* lookup = (Lookup*) graph.object (lookup_idx).head;
if (!lookup->sanitize (graph.vertices_[lookup_idx])) continue; if (!lookup || !lookup->sanitize (graph.vertices_[lookup_idx])) continue;
lookups.set (lookup_idx, lookup); lookups.set (lookup_idx, lookup);
} }
} }

View File

@ -130,7 +130,7 @@ struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallType
auto& coverage_v = c.graph.vertices_[coverage_id]; auto& coverage_v = c.graph.vertices_[coverage_id];
Coverage* coverage_table = (Coverage*) coverage_v.obj.head; Coverage* coverage_table = (Coverage*) coverage_v.obj.head;
if (!coverage_table->sanitize (coverage_v)) if (!coverage_table || !coverage_table->sanitize (coverage_v))
return false; return false;
auto new_coverage = auto new_coverage =
@ -377,7 +377,9 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
auto& class_def_1_v = graph.vertices_[class_def_1_id]; auto& class_def_1_v = graph.vertices_[class_def_1_id];
Coverage* coverage_table = (Coverage*) coverage_v.obj.head; Coverage* coverage_table = (Coverage*) coverage_v.obj.head;
ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head;
if (!coverage_table->sanitize (coverage_v) if (!coverage_table
|| !coverage_table->sanitize (coverage_v)
|| !class_def_1_table
|| !class_def_1_table->sanitize (class_def_1_v)) || !class_def_1_table->sanitize (class_def_1_v))
return -1; return -1;
@ -513,7 +515,9 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
auto& class_def_1_v = graph.vertices_[class_def_1_id]; auto& class_def_1_v = graph.vertices_[class_def_1_id];
Coverage* coverage_table = (Coverage*) coverage_v.obj.head; Coverage* coverage_table = (Coverage*) coverage_v.obj.head;
ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head;
if (!coverage_table->sanitize (coverage_v) if (!coverage_table
|| !coverage_table->sanitize (coverage_v)
|| !class_def_1_table
|| !class_def_1_table->sanitize (class_def_1_v)) || !class_def_1_table->sanitize (class_def_1_v))
return false; return false;
@ -560,7 +564,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
auto& coverage_v = c.graph.vertices_[coverage_id]; auto& coverage_v = c.graph.vertices_[coverage_id];
Coverage* coverage_table = (Coverage*) coverage_v.obj.head; Coverage* coverage_table = (Coverage*) coverage_v.obj.head;
if (!coverage_table->sanitize (coverage_v)) if (!coverage_table || !coverage_table->sanitize (coverage_v))
return &Null(Coverage); return &Null(Coverage);
return coverage_table; return coverage_table;
} }
@ -572,7 +576,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
auto& class_def_1_v = c.graph.vertices_[class_def_1_id]; auto& class_def_1_v = c.graph.vertices_[class_def_1_id];
ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head; ClassDef* class_def_1_table = (ClassDef*) class_def_1_v.obj.head;
if (!class_def_1_table->sanitize (class_def_1_v)) if (!class_def_1_table || !class_def_1_table->sanitize (class_def_1_v))
return &Null(ClassDef); return &Null(ClassDef);
return class_def_1_table; return class_def_1_table;
} }