Always lock blob in sanitize. Remove blob->lock_as() in favor of blob->lock()

This commit is contained in:
Behdad Esfahbod 2018-05-08 02:47:42 -07:00
parent b4fa505014
commit eba1c16a60
17 changed files with 34 additions and 36 deletions

View File

@ -240,11 +240,11 @@ int main (int argc, char **argv)
OT::Sanitizer<OT::COLR> sanitizerCOLR; OT::Sanitizer<OT::COLR> sanitizerCOLR;
hb_blob_t* colr_blob = sanitizerCOLR.sanitize (face->reference_table (HB_OT_TAG_COLR)); hb_blob_t* colr_blob = sanitizerCOLR.sanitize (face->reference_table (HB_OT_TAG_COLR));
const OT::COLR *colr = colr_blob->lock_as<OT::COLR> (); const OT::COLR *colr = colr_blob->as<OT::COLR> ();
OT::Sanitizer<OT::CPAL> sanitizerCPAL; OT::Sanitizer<OT::CPAL> sanitizerCPAL;
hb_blob_t* cpal_blob = sanitizerCPAL.sanitize (face->reference_table (HB_OT_TAG_CPAL)); hb_blob_t* cpal_blob = sanitizerCPAL.sanitize (face->reference_table (HB_OT_TAG_CPAL));
const OT::CPAL *cpal = cpal_blob->lock_as<OT::CPAL> (); const OT::CPAL *cpal = cpal_blob->as<OT::CPAL> ();
cairo_font_face_t *cairo_face; cairo_font_face_t *cairo_face;
{ {

View File

@ -542,7 +542,7 @@ int main (int argc, char** argv) {
OT::Sanitizer<LE_IMAGE_DOS_HEADER> sanitizer; OT::Sanitizer<LE_IMAGE_DOS_HEADER> sanitizer;
hb_blob_t *font_blob = sanitizer.sanitize (blob); hb_blob_t *font_blob = sanitizer.sanitize (blob);
const LE_IMAGE_DOS_HEADER* dos_header = font_blob->lock_as<LE_IMAGE_DOS_HEADER> (); const LE_IMAGE_DOS_HEADER* dos_header = font_blob->as<LE_IMAGE_DOS_HEADER> ();
const NE_RESOURCE_TABLE &rtable = dos_header->get_os2_header ().get_resource_table (); const NE_RESOURCE_TABLE &rtable = dos_header->get_os2_header ().get_resource_table ();
int shift = rtable.get_shift_value (); int shift = rtable.get_shift_value ();

View File

@ -118,11 +118,11 @@ _get_trak (hb_face_t *face, hb_blob_t **blob = nullptr)
// OT::Sanitizer<AAT::morx> sanitizer; // OT::Sanitizer<AAT::morx> sanitizer;
// sanitizer.set_num_glyphs (face->get_num_glyphs ()); // sanitizer.set_num_glyphs (face->get_num_glyphs ());
// hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_morx)); // hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_morx));
// morx_blob->lock_as<AAT::morx> (); // morx_blob->as<AAT::morx> ();
// if (0) // if (0)
// { // {
// morx_blob->lock_as<AAT::Lookup<OT::GlyphID> > ()->get_value (1, face->get_num_glyphs ()); // morx_blob->as<AAT::Lookup<OT::GlyphID> > ()->get_value (1, face->get_num_glyphs ());
// } // }
// } // }

View File

@ -69,12 +69,6 @@ struct hb_blob_t
{ {
return unlikely (!data) ? &Null(Type) : reinterpret_cast<const Type *> (data); return unlikely (!data) ? &Null(Type) : reinterpret_cast<const Type *> (data);
} }
template <typename Type>
inline const Type* lock_as (void)
{
lock ();
return unlikely (!data) ? &Null(Type) : reinterpret_cast<const Type *> (data);
}
public: public:
hb_object_header_t header; hb_object_header_t header;

View File

@ -135,7 +135,7 @@ _hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void
if (tag == HB_TAG_NONE) if (tag == HB_TAG_NONE)
return hb_blob_reference (data->blob); return hb_blob_reference (data->blob);
const OT::OpenTypeFontFile &ot_file = *data->blob->lock_as<OT::OpenTypeFontFile> (); const OT::OpenTypeFontFile &ot_file = *data->blob->as<OT::OpenTypeFontFile> ();
const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index); const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
const OT::OpenTypeTable &table = ot_face.get_table_by_tag (tag); const OT::OpenTypeTable &table = ot_face.get_table_by_tag (tag);
@ -426,7 +426,7 @@ void
hb_face_t::load_upem (void) const hb_face_t::load_upem (void) const
{ {
hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (reference_table (HB_OT_TAG_head)); hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (reference_table (HB_OT_TAG_head));
const OT::head *head_table = head_blob->lock_as<OT::head> (); const OT::head *head_table = head_blob->as<OT::head> ();
upem = head_table->get_upem (); upem = head_table->get_upem ();
hb_blob_destroy (head_blob); hb_blob_destroy (head_blob);
} }
@ -470,7 +470,7 @@ void
hb_face_t::load_num_glyphs (void) const hb_face_t::load_num_glyphs (void) const
{ {
hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (reference_table (HB_OT_TAG_maxp)); hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (reference_table (HB_OT_TAG_maxp));
const OT::maxp *maxp_table = maxp_blob->lock_as<OT::maxp> (); const OT::maxp *maxp_table = maxp_blob->as<OT::maxp> ();
num_glyphs = maxp_table->get_num_glyphs (); num_glyphs = maxp_table->get_num_glyphs ();
hb_blob_destroy (maxp_blob); hb_blob_destroy (maxp_blob);
} }
@ -500,7 +500,7 @@ hb_face_get_table_tags (hb_face_t *face,
hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data; hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data;
const OT::OpenTypeFontFile &ot_file = *data->blob->lock_as<OT::OpenTypeFontFile> (); const OT::OpenTypeFontFile &ot_file = *data->blob->as<OT::OpenTypeFontFile> ();
const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index); const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index);
return ot_face.get_table_tags (start_offset, table_count, table_tags); return ot_face.get_table_tags (start_offset, table_count, table_tags);

View File

@ -344,8 +344,12 @@ struct Sanitizer
DEBUG_MSG_FUNC (SANITIZE, c->start, sane ? "PASSED" : "FAILED"); DEBUG_MSG_FUNC (SANITIZE, c->start, sane ? "PASSED" : "FAILED");
if (sane) if (sane)
{
blob->lock ();
return blob; return blob;
else { }
else
{
hb_blob_destroy (blob); hb_blob_destroy (blob);
return hb_blob_get_empty (); return hb_blob_get_empty ();
} }
@ -1250,7 +1254,7 @@ struct hb_lazy_table_loader_t
if (unlikely (!p)) if (unlikely (!p))
{ {
hb_blob_t *blob_ = OT::Sanitizer<T>().sanitize (face->reference_table (T::tableTag)); hb_blob_t *blob_ = OT::Sanitizer<T>().sanitize (face->reference_table (T::tableTag));
p = const_cast<T *>(blob_->lock_as<T> ()); p = const_cast<T *>(blob_->as<T> ());
if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p)) if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p))
{ {
hb_blob_destroy (blob_); hb_blob_destroy (blob_);

View File

@ -661,7 +661,7 @@ struct cmap
inline void init (hb_face_t *face) inline void init (hb_face_t *face)
{ {
this->blob = OT::Sanitizer<OT::cmap>().sanitize (face->reference_table (HB_OT_TAG_cmap)); this->blob = OT::Sanitizer<OT::cmap>().sanitize (face->reference_table (HB_OT_TAG_cmap));
const OT::cmap *cmap = this->blob->lock_as<OT::cmap> (); const OT::cmap *cmap = this->blob->as<OT::cmap> ();
const OT::CmapSubtable *subtable = nullptr; const OT::CmapSubtable *subtable = nullptr;
const OT::CmapSubtableFormat14 *subtable_uvs = nullptr; const OT::CmapSubtableFormat14 *subtable_uvs = nullptr;

View File

@ -403,8 +403,8 @@ struct CBDT
cbdt = nullptr; cbdt = nullptr;
return; /* Not a bitmap font. */ return; /* Not a bitmap font. */
} }
cblc = cblc_blob->lock_as<CBLC> (); cblc = cblc_blob->as<CBLC> ();
cbdt = cbdt_blob->lock_as<CBDT> (); cbdt = cbdt_blob->as<CBDT> ();
} }

View File

@ -102,7 +102,7 @@ struct sbix
sanitizer.set_num_glyphs (num_glyphs); sanitizer.set_num_glyphs (num_glyphs);
sbix_blob = sanitizer.sanitize (face->reference_table (HB_OT_TAG_sbix)); sbix_blob = sanitizer.sanitize (face->reference_table (HB_OT_TAG_sbix));
sbix_len = hb_blob_get_length (sbix_blob); sbix_len = hb_blob_get_length (sbix_blob);
sbix_table = sbix_blob->lock_as<OT::sbix> (); sbix_table = sbix_blob->as<OT::sbix> ();
} }

View File

@ -99,7 +99,7 @@ struct SVG
OT::Sanitizer<OT::SVG> sanitizer; OT::Sanitizer<OT::SVG> sanitizer;
svg_blob = sanitizer.sanitize (face->reference_table (HB_OT_TAG_SVG)); svg_blob = sanitizer.sanitize (face->reference_table (HB_OT_TAG_SVG));
svg_len = hb_blob_get_length (svg_blob); svg_len = hb_blob_get_length (svg_blob);
svg = svg_blob->lock_as<OT::SVG> (); svg = svg_blob->as<OT::SVG> ();
} }

View File

@ -237,7 +237,7 @@ struct glyf
memset (this, 0, sizeof (accelerator_t)); memset (this, 0, sizeof (accelerator_t));
hb_blob_t *head_blob = Sanitizer<head>().sanitize (face->reference_table (HB_OT_TAG_head)); hb_blob_t *head_blob = Sanitizer<head>().sanitize (face->reference_table (HB_OT_TAG_head));
const head *head_table = head_blob->lock_as<head> (); const head *head_table = head_blob->as<head> ();
if (head_table == &Null(head) || (unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0) if (head_table == &Null(head) || (unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0)
{ {
/* head table is not present, or in an unknown format. Leave num_glyphs=0, that takes care of disabling us. */ /* head table is not present, or in an unknown format. Leave num_glyphs=0, that takes care of disabling us. */
@ -248,9 +248,9 @@ struct glyf
hb_blob_destroy (head_blob); hb_blob_destroy (head_blob);
loca_blob = Sanitizer<loca>().sanitize (face->reference_table (HB_OT_TAG_loca)); loca_blob = Sanitizer<loca>().sanitize (face->reference_table (HB_OT_TAG_loca));
loca_table = loca_blob->lock_as<loca> (); loca_table = loca_blob->as<loca> ();
glyf_blob = Sanitizer<glyf>().sanitize (face->reference_table (HB_OT_TAG_glyf)); glyf_blob = Sanitizer<glyf>().sanitize (face->reference_table (HB_OT_TAG_glyf));
glyf_table = glyf_blob->lock_as<glyf> (); glyf_table = glyf_blob->as<glyf> ();
num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1; num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1;
glyf_len = hb_blob_get_length (glyf_blob); glyf_len = hb_blob_get_length (glyf_blob);

View File

@ -196,7 +196,7 @@ struct hmtxvmtx
if (T::os2Tag) if (T::os2Tag)
{ {
hb_blob_t *os2_blob = Sanitizer<os2> ().sanitize (face->reference_table (T::os2Tag)); hb_blob_t *os2_blob = Sanitizer<os2> ().sanitize (face->reference_table (T::os2Tag));
const os2 *os2_table = os2_blob->lock_as<os2> (); const os2 *os2_table = os2_blob->as<os2> ();
#define USE_TYPO_METRICS (1u<<7) #define USE_TYPO_METRICS (1u<<7)
if (0 != (os2_table->fsSelection & USE_TYPO_METRICS)) if (0 != (os2_table->fsSelection & USE_TYPO_METRICS))
{ {
@ -209,7 +209,7 @@ struct hmtxvmtx
} }
hb_blob_t *_hea_blob = Sanitizer<H> ().sanitize (face->reference_table (H::tableTag)); hb_blob_t *_hea_blob = Sanitizer<H> ().sanitize (face->reference_table (H::tableTag));
const H *_hea_table = _hea_blob->lock_as<H> (); const H *_hea_table = _hea_blob->as<H> ();
num_advances = _hea_table->numberOfLongMetrics; num_advances = _hea_table->numberOfLongMetrics;
if (!got_font_extents) if (!got_font_extents)
{ {
@ -238,10 +238,10 @@ struct hmtxvmtx
hb_blob_destroy (blob); hb_blob_destroy (blob);
blob = hb_blob_get_empty (); blob = hb_blob_get_empty ();
} }
table = blob->lock_as<hmtxvmtx> (); table = blob->as<hmtxvmtx> ();
var_blob = Sanitizer<HVARVVAR> ().sanitize (face->reference_table (T::variationsTag)); var_blob = Sanitizer<HVARVVAR> ().sanitize (face->reference_table (T::variationsTag));
var_table = var_blob->lock_as<HVARVVAR> (); var_table = var_blob->as<HVARVVAR> ();
} }
inline void fini (void) inline void fini (void)

View File

@ -363,7 +363,7 @@ struct kern
inline void init (hb_face_t *face) inline void init (hb_face_t *face)
{ {
blob = Sanitizer<kern>().sanitize (face->reference_table (HB_OT_TAG_kern)); blob = Sanitizer<kern>().sanitize (face->reference_table (HB_OT_TAG_kern));
table = blob->lock_as<kern> (); table = blob->as<kern> ();
table_length = hb_blob_get_length (blob); table_length = hb_blob_get_length (blob);
} }
inline void fini (void) inline void fini (void)

View File

@ -59,13 +59,13 @@ _hb_ot_layout_create (hb_face_t *face)
return nullptr; return nullptr;
layout->gdef_blob = OT::Sanitizer<OT::GDEF>().sanitize (face->reference_table (HB_OT_TAG_GDEF)); layout->gdef_blob = OT::Sanitizer<OT::GDEF>().sanitize (face->reference_table (HB_OT_TAG_GDEF));
layout->gdef = layout->gdef_blob->lock_as<OT::GDEF> (); layout->gdef = layout->gdef_blob->as<OT::GDEF> ();
layout->gsub_blob = OT::Sanitizer<OT::GSUB>().sanitize (face->reference_table (HB_OT_TAG_GSUB)); layout->gsub_blob = OT::Sanitizer<OT::GSUB>().sanitize (face->reference_table (HB_OT_TAG_GSUB));
layout->gsub = layout->gsub_blob->lock_as<OT::GSUB> (); layout->gsub = layout->gsub_blob->as<OT::GSUB> ();
layout->gpos_blob = OT::Sanitizer<OT::GPOS>().sanitize (face->reference_table (HB_OT_TAG_GPOS)); layout->gpos_blob = OT::Sanitizer<OT::GPOS>().sanitize (face->reference_table (HB_OT_TAG_GPOS));
layout->gpos = layout->gpos_blob->lock_as<OT::GPOS> (); layout->gpos = layout->gpos_blob->as<OT::GPOS> ();
layout->math.init (face); layout->math.init (face);
layout->fvar.init (face); layout->fvar.init (face);

View File

@ -110,7 +110,7 @@ struct post
inline void init (hb_face_t *face) inline void init (hb_face_t *face)
{ {
blob = Sanitizer<post>().sanitize (face->reference_table (HB_OT_TAG_post)); blob = Sanitizer<post>().sanitize (face->reference_table (HB_OT_TAG_post));
const post *table = blob->lock_as<post> (); const post *table = blob->as<post> ();
unsigned int table_length = hb_blob_get_length (blob); unsigned int table_length = hb_blob_get_length (blob);
version = table->version.to_int (); version = table->version.to_int ();

View File

@ -87,7 +87,7 @@ _subset (hb_subset_plan_t *plan)
OT::Sanitizer<TableType> sanitizer; OT::Sanitizer<TableType> sanitizer;
hb_blob_t *source_blob = sanitizer.sanitize (plan->source->reference_table (TableType::tableTag)); hb_blob_t *source_blob = sanitizer.sanitize (plan->source->reference_table (TableType::tableTag));
const TableType *table = source_blob->lock_as<TableType> (); const TableType *table = source_blob->as<TableType> ();
hb_tag_t tag = TableType::tableTag; hb_tag_t tag = TableType::tableTag;
hb_bool_t result = false; hb_bool_t result = false;

View File

@ -56,7 +56,7 @@ main (int argc, char **argv)
Sanitizer<OpenTypeFontFile> sanitizer; Sanitizer<OpenTypeFontFile> sanitizer;
hb_blob_t *font_blob = sanitizer.sanitize (blob); hb_blob_t *font_blob = sanitizer.sanitize (blob);
const OpenTypeFontFile* sanitized = font_blob->lock_as<OpenTypeFontFile> (); const OpenTypeFontFile* sanitized = font_blob->as<OpenTypeFontFile> ();
if (sanitized == &Null (OpenTypeFontFile)) if (sanitized == &Null (OpenTypeFontFile))
{ {
printf ("Sanitization of the file wasn't successful. Exit"); printf ("Sanitization of the file wasn't successful. Exit");